看题目的出门左拐:

  http://www.zybbs.org/JudgeOnline/problem.php?id=1036  

  题目大意:给定一棵加权树,实现修改任意节点权值,求两点间路径最大值和权值和的操作。

  看到题目想都没想就LCT了,敲啊敲、敲啊敲……本来YY着1A的,然后发现WA了……第一个点就WA了……

  囧……分析了好半天……睡了一觉……猛然想起自己宏定义的INF……

  原来宏定义INF ~0u>>1然后赋值-INF会出问题的- -

  我对C++了解不熟……学习了……

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#define NIL LCT
#define INF 0x7f7f7f7f
#define mn 130001
#define mm 300000
using namespace std;
template<class T>inline void gmax(T &a,T b){if(a<b)a=b;}queue<int> q;
int n,m,a,b,value[mn];
char s[10];
struct EDGE{int pnt;EDGE *pre;EDGE (){}EDGE(int _pnt,EDGE *_pre):pnt(_pnt),pre(_pre){}
}Edge[mm*2],*SP=Edge,*edge[mm];inline void addedge(int a,int b){edge[a]=new(++SP)EDGE(b,edge[a]);edge[b]=new(++SP)EDGE(a,edge[b]);
}struct LinkCutTree{struct NODE{int val,maxn,sum;bool root;NODE *left,*right,*father;NODE (){}NODE(int _val,NODE *_left,NODE *_right,NODE *_father):val(_val),left(_left),right(_right),father(_father){root=true;}}LCT[mn],*NP,*node[mn];void init(){NP=NIL;NIL->val=NIL->maxn=-INF;NIL->sum=0;NIL->left=NIL->right=NIL->father=NIL;NIL->root=false;}void build(){q.push(1);node[1]=new(++NP)NODE(value[1],NIL,NIL,NIL);while(!q.empty()){int i=q.front();q.pop();for(EDGE *j=edge[i];j;j=j->pre)if(node[j->pnt]!=node[i]->father){node[j->pnt]=new(++NP)NODE(value[j->pnt],NIL,NIL,node[i]);q.push(j->pnt);}}}void update(NODE *&t){t->sum=t->left->sum+t->right->sum+t->val;t->maxn=max(t->val,max(t->left->maxn,t->right->maxn));}void zig(NODE *&t){NODE *f=t->father,*r=t->right;t->father=f->father;if(f->root){t->root=true;f->root=false;}else{if(f->father->left==f) f->father->left=t;else f->father->right=t;}t->right=f,f->father=t,f->left=r,r->father=f;update(f);}void zag(NODE *&t){NODE *f=t->father,*l=t->left;t->father=f->father;if(f->root){t->root=true;f->root=false;}else{if(f->father->left==f) f->father->left=t;else f->father->right=t;}t->left=f;f->father=t,f->right=l,l->father=f;update(f);}void splay(NODE *&t){while(!t->root){if(t->father->root){if(t->father->left==t) zig(t);else zag(t);}else{if(t->father->father->left==t->father){if(t->father->left==t) zig(t->father),zig(t);else zag(t),zig(t);}else{if(t->father->left==t) zig(t),zag(t);else zag(t->father),zag(t);}}}update(t);}void Expose(NODE *&t){NODE *p=t,*q=NIL;while(p!=NIL){splay(p);p->right->root=true;p->right=q;p->right->root=false;update(p);q=p,p=p->father;}}void Modify(int t,int key){node[t]->val=key;update(node[t]);splay(node[t]);}void queryMax(int a,int b){Expose(node[a]);NODE *p=node[b],*q=NIL;while(p!=NIL){splay(p);if(p->father==NIL) printf("%d\n",max(p->val,max(p->right->maxn,q->maxn)));p->right->root=true;p->right=q;p->right->root=false;update(p);q=p,p=p->father;}}void querySum(int a,int b){Expose(node[a]);NODE *p=node[b],*q=NIL;while(p!=NIL){splay(p);if(p->father==NIL)printf("%d\n",p->right->sum+q->sum+p->val);p->right->root=true;p->right=q;p->right->root=false;update(p);q=p,p=p->father;}}
}tree;int main(){scanf("%d",&n);for(int i=1;i<n;i++){scanf("%d%d",&a,&b);addedge(a,b);}for(int i=1;i<=n;i++) scanf("%d",&value[i]);tree.init();tree.build();scanf("%d\n",&m);while(m--){scanf("%s",s);scanf("%d%d",&a,&b);switch(s[1]){case 'M':tree.queryMax(a,b);break;case 'S':tree.querySum(a,b);break;case 'H':tree.Modify(a,b);}}return 0;
}

转载于:https://www.cnblogs.com/Delostik/archive/2011/08/06/2129520.html

【ZJOI 2008】树的统计 Count相关推荐

  1. zjoi 2008 树的统计——树链剖分

    比较基础的一道树链剖分的题 大概还是得说说思路 树链剖分是将树剖成很多条链,比较常见的剖法是按儿子的size来剖分,剖分完后对于这课树的询问用线段树维护--比如求路径和的话--随着他们各自的链向上走, ...

  2. [ZJOI2008][BZOJ1036] 树的统计count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 7980  Solved: 3266 [Submi ...

  3. 树链剖分入门+HYSBZ - 1036树的统计Count

    今天学习了树链剖分,记录一下. [题目背景] HYSBZ - 1036树的统计Count [题目分析] 题目要求求任意结点之间路径的和以及路径上最大的结点,还有可能修改.如果正常做可能会很复杂(我也不 ...

  4. BZOJ 1036: [ZJOI2008]树的统计Count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3427  Solved: 1429 [Submi ...

  5. 树链剖分(bzoj 1036: [ZJOI2008]树的统计Count)

    树链剖分: 把一棵树剖分为若干条链,然后利用数据结构(树状数组,SBT,Splay,线段树等等)去维护每一条链,复杂度 为O(logn),总体复杂度O(nlog²n) 步骤: ①将树的边分成重边和轻边 ...

  6. [bzoj1036][ZJOI2008]树的统计Count

    Description 一棵树上有$n$个节点,编号分别为$1$到$n$,每个节点都有一个权值$w_i$. 有三种操作: $1.CHANGE\;u\;t$:把结点$u$的权值改为$t$; $2.QMA ...

  7. bzoj1036: [ZJOI2008]树的统计Count 树链剖分

    一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从 ...

  8. BZOJ1036: [ZJOI2008]树的统计Count

    Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. Q ...

  9. BZOJ 1036 [ZJOI2008]树的统计Count

    以前动态树写过这个题,今天尝试树链剖分解决~ 模板题,就声明一点,线段树维护的是点权 View Code 1 #include <iostream> 2 #include <cstd ...

最新文章

  1. 一次搞定:分布式缓存 Redis 集群搭建!
  2. Linux下对SVN的相关操作命令
  3. HTTP,request,response
  4. C++求解最大子序列和问题
  5. 页面显示其他php,php – 分页在所有其他页面上显示来自第1页的相同帖子
  6. Android大环境杂谈待续中
  7. [20190530]oracle Audit文件管理.txt
  8. 2018年3月11日论文阅读
  9. Android NavigationView中设置menu中的item字体颜色
  10. android mp3文件图片,android 完美获取音乐文件中的专辑图片并显示
  11. 七牛云存储,资源云存储平台
  12. 深入理解Nginx——链接
  13. 中标麒麟操作系统离线安装nginx
  14. 谷歌浏览器误删怎么办
  15. 查看oracle归档日志内容,查看归档日志内容
  16. 春季必买明星款流行春装
  17. 数据库实验--存储过程实验
  18. javax.faces.webapp.FacesServlet
  19. Python:Python语言的简介(语言特点/pyc介绍/Python版本语言兼容问题(python2 VS Python3))、安装、学习路线(数据分析/机器学习/网页爬等编程案例分析)之详细攻略
  20. 由椭圆一般方程求解椭圆标准方程参数

热门文章

  1. Verilog初级教程(20)Verilog中的`ifdef 条件编译语句
  2. JVM:查看java内存情况命令
  3. 转:【AI每日播报】从TensorFlow到Theano:横向对比七大深度学习框架
  4. MapReduce过程详细分析
  5. Linux系统设置定时任务
  6. day1 作业二:多级菜单操作
  7. sinatra 基本用法
  8. iOS 之 事件响应者链
  9. 此选项卡已恢复的处理过程
  10. servlet 变量 及servlet 初始化 和销毁 ThreadLocal