BZOJ 1036: [ZJOI2008]树的统计Count (LCT题解)
来源:互联网 发布:java经典书籍 编辑:程序博客网 时间:2024/06/05 00:36
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 17411 Solved: 7109
Description
一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成
一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 I
II. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身
Input
输入的第一行为一个整数n,表示节点的个数。接下来n – 1行,每行2个整数a和b,表示节点a和节点b之间有
一条边相连。接下来n行,每行一个整数,第i行的整数wi表示节点i的权值。接下来1行,为一个整数q,表示操作
的总数。接下来q行,每行一个操作,以“CHANGE u t”或者“QMAX u v”或者“QSUM u v”的形式给出。
对于100%的数据,保证1<=n<=30000,0<=q<=200000;中途操作中保证每个节点的权值w在-30000到30000之间。
Output
对于每个“QMAX”或者“QSUM”的操作,每行输出一个整数表示要求输出的结果。
Sample Input
4
1 2
2 3
4 1
4 2 1 3
12
QMAX 3 4
QMAX 3 3
QMAX 3 2
QMAX 2 3
QSUM 3 4
QSUM 2 1
CHANGE 1 5
QMAX 3 4
CHANGE 3 6
QMAX 3 4
QMAX 2 4
QSUM 3 4
Sample Output
4
1
2
2
10
6
5
6
5
16
LCT水过去,现在才发现链剖好写好调,这才是我的第三道LCT,我太菜了,唉
#include<cstdio>#include<iostream>#include<cstring>using namespace std;const int MAXN=300000+100;struct Line{ int to,nxt;}line[MAXN*2+10];int head[MAXN],tail,n,from,to;void add_line(int from,int to){tail++;line[tail].to=to;line[tail].nxt=head[from];head[from]=tail;}struct Tree{ int rev,val,fa,child[2],maxn,sumn;}tree[MAXN];void pushup(int x){ tree[x].maxn=max(tree[tree[x].child[0]].maxn,tree[tree[x].child[1]].maxn); tree[x].maxn=max(tree[x].maxn,tree[x].val); tree[x].sumn=tree[tree[x].child[0]].sumn+tree[tree[x].child[1]].sumn+tree[x].val;}void pushdown(int x){ if(tree[x].rev){ tree[x].rev^=1;tree[tree[x].child[0]].rev^=1;tree[tree[x].child[1]].rev^=1; swap(tree[x].child[0],tree[x].child[1]); }}bool isroot(int x){ return tree[tree[x].fa].child[0]!=x&&tree[tree[x].fa].child[1]!=x;}void Pushdown(int x){ if(!isroot(x))Pushdown(tree[x].fa); pushdown(x);}void rotate(int x){ int y=tree[x].fa,z=tree[y].fa,l,r; if(tree[y].child[0]==x) l=0;else l=1;r=l^1; if(!isroot(y)){ if(tree[z].child[0]==y) tree[z].child[0]=x; else tree[z].child[1]=x; } tree[tree[x].child[r]].fa=y;tree[y].fa=x;tree[x].fa=z; tree[y].child[l]=tree[x].child[r];tree[x].child[r]=y; pushup(y);pushup(x);}void splay(int x){ Pushdown(x); while(!isroot(x)){ int y=tree[x].fa,z=tree[y].fa; if(!isroot(y)){ if((tree[y].child[0]==x)^(tree[z].child[0]==y)) rotate(x); else rotate(y); } rotate(x); }}void access(int x){for(register int i=0;x;i=x,x=tree[x].fa){splay(x);tree[x].child[1]=i;pushup(x);}}void makeroot(int x){access(x);splay(x);tree[x].rev^=1;}void dfs(int u,int fa){ for(register int i=head[u];i;i=line[i].nxt){ int v=line[i].to; if(v!=fa){ tree[v].fa=u; dfs(v,u); } }}void init(){ scanf("%d",&n); tree[0].maxn=-2147483647; for(register int i=1;i<=n-1;i++){ scanf("%d%d",&from,&to); add_line(from,to);add_line(to,from); } dfs(1,0); for(register int i=1;i<=n;i++) scanf("%d",&tree[i].val),tree[i].maxn=tree[i].sumn=tree[i].val; }void solve(){ int Q,x,y;scanf("%d",&Q); char opt[10]; while(Q--){ scanf("%s",&opt); if(opt[1]=='H'){ scanf("%d%d",&x,&y); splay(x);tree[x].val=y;pushup(x); }else if(opt[1]=='M'){ scanf("%d%d",&x,&y); makeroot(x);access(y);splay(y);printf("%d\n",tree[y].maxn); }else{ scanf("%d%d",&x,&y); makeroot(x);access(y);splay(y);printf("%d\n",tree[y].sumn); } }}int main(){ init(); solve(); return 0;}
- BZOJ 1036: [ZJOI2008]树的统计Count (LCT题解)
- bzoj 1036 [ZJOI2008]树的统计Count 点权lct
- 树链剖分教程 & bzoj 1036 [ZJOI2008] 树的统计 Count 题解
- BZOJ 1036 [ZJOI2008]树的统计 Count 题解&代码
- 树链剖分& bzoj 1036 [ZJOI2008] 树的统计 Count 题解
- HYSBZ/BZOJ 1036 [ZJOI2008] 树的统计Count - 动态树LCT
- [BZOJ1036][ZJOI2008]树的统计Count && LCT
- BZOJ 1036: [ZJOI2008]树的统计Count
- BZOJ 1036: [ZJOI2008]树的统计Count
- 【BZOJ 1036】[ZJOI2008]树的统计Count
- bzoj 1036: [ZJOI2008]树的统计Count
- BZOJ 1036 [ZJOI2008]树的统计Count
- BZOJ 1036: [ZJOI2008]树的统计Count
- BZOJ 1036 [ZJOI2008]树的统计Count
- bzoj 1036 [ZJOI2008]树的统计Count
- 【bzoj】1036: [ZJOI2008]树的统计Count
- [BZOJ]1036: [ZJOI2008]树的统计Count
- BZOJ 1036 [ZJOI2008] 树的统计Count
- 消息中间件
- 关于蓝牙权限的获取与开启
- cocos2d-x + vs2015 android游戏开发环境搭建 及 新建项目
- 带头结点的单链表和不带头结点的单链表的倒数第K个节点
- Find The Multiple
- BZOJ 1036: [ZJOI2008]树的统计Count (LCT题解)
- 排序二:希尔排序
- 新手上路之 js undefined问题
- 牛客网剑指offer-从尾到头打印链表
- maven构建hibernate项目及其详解
- GCD功能介绍与实践
- Win10如何安装vs2015+cocos2d-x 3.9开发环境?安装配置教程分享
- 数组逆序
- 数据结构(第二天)单向循环链表的创建,插入元素,(删除、查询元素跟单链表操作基本一致)