poj 3468 A Simple Problem with Integers splay

来源:互联网 发布:win10 1701端口打不开 编辑:程序博客网 时间:2024/05/21 06:30

题意:给出一个数列,资瓷两个操作:

Q x y求x到y的和

C x y z从x到y每个数加上z


分析:线段树水题,可以用splay做

因为是区间操作,所以要用到lazy标记。

注意别让虚节点影响到结果。

结果要用long long


代码:

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#define N 100005#define inf 0x7fffffffusing namespace std;int root;struct tree{int l,r,fa,lazy,num,s,k;long long sum;}t[N];void updata(int x){t[x].s=t[t[x].l].s+t[t[x].r].s+t[x].num;t[x].sum=(long long)t[t[x].l].sum+t[t[x].r].sum+t[x].k;}void rttl(int x){int y=t[x].r;if (x==root) root=y;t[x].r=t[y].l;t[t[y].l].fa=x;t[y].fa=t[x].fa;if (x==t[t[x].fa].l) t[t[x].fa].l=y;else t[t[x].fa].r=y;t[y].l=x;t[x].fa=y;updata(x);updata(y);}void rttr(int x){int y=t[x].l;if (x==root) root=y;t[x].l=t[y].r;t[t[y].r].fa=x;t[y].fa=t[x].fa;if (x==t[t[x].fa].l) t[t[x].fa].l=y;else t[t[x].fa].r=y;t[y].r=x;t[x].fa=y;updata(x);updata(y);}void remove(int x){if (x==0) return;remove(t[x].fa);if (t[x].lazy){int w=t[x].lazy;t[x].lazy=0;if (t[x].l){t[t[x].l].sum+=(long long)t[t[x].l].s*w;t[t[x].l].lazy+=w;if (t[x].num==1) t[t[x].l].k+=w;}if (t[x].r){t[t[x].r].sum+=(long long)t[t[x].r].s*w;t[t[x].r].lazy+=w;if (t[x].num==1) t[t[x].r].k+=w;}}}void splay(int x,int y){remove(x);while (t[x].fa!=y){int f=t[x].fa,p=t[f].fa;if (p==y)if (x==t[f].l) rttr(f);else rttl(f);else{if (x==t[f].l){if (f==t[p].l){rttr(p);rttr(f);}else{rttr(f);rttl(p);}}else{if (f==t[p].l){rttl(f);rttr(p);}else{rttl(p);rttl(f);}}}}}int main(){int n,m;scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)scanf("%d",&t[i+1].k);t[1].fa=2;t[1].sum=t[1].k;for (int i=2;i<=n+1;i++){t[i].l=i-1;t[i].fa=i+1;t[i].sum=t[i-1].sum+t[i].k;t[i].s=t[i-1].s+1;t[i].num=1;}t[n+2].l=n+1;t[n+2].sum=t[n+1].sum;root=n+2;splay(1,0);for (int i=1;i<=m;i++){char ch[2];int x,y,z;scanf("%s",ch);if (ch[0]=='Q'){scanf("%d%d",&x,&y);y+=2;splay(x,0);splay(y,x);printf("%lld\n",t[t[y].l].sum);}else{scanf("%d%d%d",&x,&y,&z);y+=2;splay(x,0);splay(y,x);t[t[y].l].lazy+=z;t[t[y].l].k+=z;t[t[y].l].sum+=z*t[t[y].l].s;updata(y);updata(x);}}return 0;}


0 0
原创粉丝点击