BZOJ1036 [ZJOI2008]树的统计Count

来源:互联网 发布:java web前端 编辑:程序博客网 时间:2024/05/12 07:14

标签:LCT

题目

题目传送门

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裸题,这题树剖也可以

code

#include<iostream>#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#define rep(i,a,b) for(int i=a;i<=b;i++)#define dep(i,a,b) for(int i=a;i>=b;i--)#define ll long long#define inf 1000000000#define mem(x,num) memset(x,num,sizeof x)using namespace std;inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}const int maxn=30006;int n,m,top,fa[maxn],c[maxn][2],u[maxn],v[maxn],s[maxn];ll w[maxn],sum[maxn],mx[maxn];bool rev[maxn];bool isroot(int x){return c[fa[x]][0]!=x&&c[fa[x]][1]!=x;}void update(int x){    int l=c[x][0],r=c[x][1];    sum[x]=sum[l]+sum[r]+w[x];    mx[x]=max(max(mx[l],mx[r]),w[x]);}void pushdown(int x){    int l=c[x][0],r=c[x][1];    if(rev[x]){        rev[x]^=1;rev[l]^=1;rev[r]^=1;        swap(c[x][0],c[x][1]);    }}void rotate(int x){    int y=fa[x],z=fa[y],l,r;    l=(c[y][1]==x);r=l^1;    if(!isroot(y))c[z][c[z][1]==y]=x;    fa[c[x][r]]=y;fa[y]=x;fa[x]=z;    c[y][l]=c[x][r];c[x][r]=y;    update(y);update(x);}void splay(int x){    s[++top]=x;    for(int i=x;!isroot(i);i=fa[i])s[++top]=fa[i];    while(top)pushdown(s[top--]);    while(!isroot(x)){        int y=fa[x],z=fa[y];        if(!isroot(y)){            if(c[y][0]==x^c[z][0]==y)rotate(x);            else rotate(y);        }        rotate(x);    }}void access(int x){    for(int now=0;x;now=x,x=fa[x])splay(x),c[x][1]=now,update(x);}void makeroot(int x){access(x);splay(x);rev[x]^=1;}void link(int x,int y){makeroot(x);fa[x]=y;}void split(int x,int y){makeroot(x);access(y);splay(y);}int main(){    n=read();mx[0]=-inf;    rep(i,1,n-1)u[i]=read(),v[i]=read();    rep(i,1,n)w[i]=read(),sum[i]=mx[i]=w[i];    rep(i,1,n-1)link(u[i],v[i]);    m=read();    char ch[10];int x,y;    rep(i,1,m){        scanf("%s",ch);        x=read(),y=read();        if(ch[1]=='H'){splay(x);w[x]=y;update(x);}        if(ch[1]=='M'){split(x,y);printf("%lld\n",mx[y]);}        if(ch[1]=='S'){split(x,y);printf("%lld\n",sum[y]);}    }    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为手机与电脑连接不上怎么办 买房交了首付贷不了款怎么办 手机买贵了实体店不肯退怎么办 在实体店里手机买贵了怎么办 红米手机开启不了安装系统怎么办? 捡个荣耀8双清后要账号怎么办 荣耀7x升级8.0后耗电快怎么办 手机提示当前为耳机播放模式怎么办 华为手机进水了显示耳机模式怎么办 苹果6s突然变成耳机模式怎么办 华为手机出现耳机标志没声音怎么办 苹果手机微信变成耳机模式怎么办 5s不能用4g网络怎么办 华为麦芒四手机系统乱了好卡怎么办 信翼路由器登录密码忘了怎么办 苹果手机电信4g信号变3g怎么办 苹果7手机4g变3g怎么办 朵唯v3逆客手机不支持计步怎么办 移动卡升级4g后网络不好怎么办 电信办宽带送的手机卡不用了怎么办 移动华为悦盒遥控器丢了怎么办 移动签了两年套餐不想用了怎么办 华为手机隐私空间密码忘记了怎么办 华为的隐私空间密码忘记了怎么办 格力新机没密码开不了怎么办 百度下载谷歌浏览器网页错误怎么办 华为手机进水开不了机怎么办开 华为7x金属外壳掉漆了怎么办 华为麦芒6连接蓝牙音响卡顿怎么办 华为芒麦6恢复出厂设置怎么办 华为麦芒4下拉通知栏没反应怎么办 怎么看华为麦芒6信号差怎么办 华为手机锁屏密码忘了怎么办 苹果手机进水后手机卡无服务怎么办 摩拜单车绑定的手机号注销了怎么办 摩拜单车注册的手机号注销了怎么办 摩拜单车注册手机号换了怎么办 被手机店骗话费送合约机怎么办 机蜜租赁的手机丢了怎么办 合约机返话费手机掉了怎么办 手机摔坏了开不了机怎么办