LCT解法解决数据结构神薙bzoj1036

来源:互联网 发布:windows 错误恢复 编辑:程序博客网 时间:2024/06/01 09:39

确实是神(mo ban)薙(ti)

好多数据结构都靠这个入门- -

用LCT解这道题也很简单。

维护val,maxval,sum.

CHANGE的时候把这个点旋到当前splay的根,然后进行操作

QMAX,先把u设为整棵树的根,再把v旋到当前splay的根,然后找到当前树(u-v这条路径)的根,读取信息

QSUM,和上面一样,读取SUM.


然后就是模板了:

#include<cstdio>#include<iostream>#include<cstring>#include<cstdlib>#include<algorithm>#include<queue>#include<cmath>using namespace std;const int maxn=30000+20;const int inf=0x3f3f3f3f;struct node{node *f;node *ch[2];int val;int sum;int maxval;bool rev;}tree[maxn],*null,Tnull;void init(node *u){u->f=u->ch[0]=u->ch[1]=null;u->val=u->sum=0;u->maxval=-inf;u->rev=0;}void pushup(node *u){u->sum=u->val+u->ch[0]->sum+u->ch[1]->sum;u->maxval=max(u->val,max(u->ch[0]->maxval,u->ch[1]->maxval));}void pushdown(node *u){if(u==null)return ;if(u->rev){swap(u->ch[0],u->ch[1]);if(u->ch[0]!=null)u->ch[0]->rev^=1;if(u->ch[1]!=null)u->ch[1]->rev^=1;u->rev=0;}}bool isroot(node *u){return u==null||u->f->ch[0]!=u&&u->f->ch[1]!=u;}void rotate(node *u){node *f=u->f;node *ff=f->f;int d=u==f->ch[1];if(u->ch[d^1]!=null)u->ch[d^1]->f=f;f->ch[d]=u->ch[d^1];u->f=ff;if(ff!=null){if(f==ff->ch[0])ff->ch[0]=u;else if(f==ff->ch[1])ff->ch[1]=u;}u->ch[d^1]=f;f->f=u;pushup(f);pushup(u);}int cnt;node *sta[maxn];void splay(node *u){if(u==null)return ;cnt=1;sta[0]=u;for(node *y=u;!isroot(y);y=y->f){sta[cnt++]=y->f;}while(cnt)pushdown(sta[--cnt]);while(!isroot(u)){node *f=u->f;if(isroot(f)){rotate(u);}else{node *ff=f->f;int d=u==f->ch[1];int dd=f==ff->ch[1];if(d==dd)rotate(f);else rotate(u);rotate(u);}}pushup(u);}node *access(node *u){node *v=null;while(u!=null){splay(u);u->ch[1]=v;v->f=u;pushup(u);v=u;u=u->f;}return v;}int n,m;int head[maxn];struct edge{int v,next;}e[2*maxn];int det[maxn];int k;void add(int u,int v){e[k].v=v;e[k].next=head[u];head[u]=k++;}void dfs(int u,int f){tree[u].val=tree[u].maxval=tree[u].sum=det[u];if(f!=-1)tree[u].f=tree+f;else tree[u].f=null;for(int i=head[u];~i;i=e[i].next){int v=e[i].v;if(v==f)continue;dfs(v,u);}}void changeroot(node *u){access(u)->rev^=1;}char ss[20];node *getroot(node *u){access(u);splay(u);while(u->f!=null)u=u->f;splay(u);return u;}void QMAX(node *u,node *v){changeroot(u);access(v);node *q=getroot(v);printf("%d\n",q->maxval);}void QSUM(node *u,node *v){changeroot(u);access(v);node *q=getroot(v);printf("%d\n",q->sum);}void CHANGE(node *u,int v){access(u);splay(u);u->val=v;pushup(u);}int main(){k=1;memset(head,-1,sizeof(head));null=&Tnull;init(null);scanf("%d",&n);for(int i=1;i<=n;i++)init(&tree[i]);for(int i=1;i<n;i++){int a,b;scanf("%d%d",&a,&b);add(a,b);add(b,a);}for(int i=1;i<=n;i++)scanf("%d",&det[i]);dfs(1,-1);scanf("%d",&m);int u,v;for(int i=1;i<=m;i++){scanf("%s%d%d",ss,&u,&v);if(ss[1]=='M')QMAX(tree+u,tree+v);else if(ss[1]=='S')QSUM(tree+u,tree+v);else CHANGE(tree+u,v);}return 0;}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 家具连接扣坏了怎么办 锅炉炉水碱度低怎么办 快递里面的东西少了怎么办 很多闲置在家里的东西怎么办 闲鱼买的东西与原物不对怎么办 退款后又发货了怎么办 淘宝卖家不发货也不退款怎么办 已经申请退款卖家仍发货怎么办 淘宝卖家已发货买家申请退款怎么办 爱上街App不发货怎么办 阿里卖家虚假发货怎么办 联系不到淘宝卖家怎么办 没货买家不退款怎么办 买到假货没有发票怎么办 淘宝买的手机发票怎么办 淘宝上的发票丢了怎么办 淘宝买的东西电子发票怎么办 发票联给错顾客怎么办 客人让多给发票怎么办 13岁早晨上学叫不醒怎么办 官换机过保坏了怎么办 官换机在保坏了怎么办 留学生美国东西寄回国怎么办便宜 淘宝东西没到收货了怎么办 在淘宝上买东西被骗怎么办 网上把钱骗走了怎么办 在淘宝上卖号被骗了怎么办 如果淘宝商家保证金不够退款怎么办 天猫账号忘记了怎么办 姨妈来了10天了怎么办 微店商品无资质被下架怎么办 微店商品无资质怎么办 淘宝买东西提前确认收货了怎么办 苹果手机王者荣耀充值充多了怎么办 买家淘宝账号出现虚拟交易怎么办 贵州通登录不上怎么办 华为手机媒体声音小怎么办 苹果七内存满了怎么办 华为p9玩王者卡怎么办 鞋放健身房丢了怎么办 京东商家搞虚假活动怎么办