蒟蒻求助,刚学区间树,维护数列那题

P2042 [NOI2005] 维护数列

```cpp #include<bits/stdc++.h> #define TAGNONE 10000001 #define maxn 4000010 #define inf 100000001 #define L(node) (tree[node].ch[0]) #define R(node) (tree[node].ch[1]) #define F(node) (tree[node].fa) #define V(node) (tree[node].val) #define S(node) (tree[node].size) #define compare(node,x) (tree[node].val<x) using namespace std; int root,cnt,a[maxn],id[maxn]; struct kkk{ int ch[2],size,fa,tag=TAGNONE,val,rev; int sum,left,right,middle; }tree[maxn]; void pushup(int node){ kkk &x=tree[L(node)],&y=tree[R(node)];int val=tree[node].val; kkk &res=tree[node]; res.sum=x.sum+y.sum+val;res.size=x.size+y.size+1; res.middle=max(max(x.middle,y.middle),x.right+y.left+val); res.left=max(x.left,x.sum+y.left+val); res.right=max(y.right,y.sum+x.right+val); } void change_val(int node,int val){ if(!node)return ; tree[node].tag=tree[node].val=val; tree[node].sum=val*tree[node].size; tree[node].left=tree[node].right=max(tree[node].sum,0); tree[node].middle=max(tree[node].sum,val); } void change_rev(int node){ if(!node)return ; swap(tree[node].ch[0],tree[node].ch[1]); swap(tree[node].left,tree[node].right); tree[node].rev^=1; } void pushdown(int node){ if(tree[node].tag!=TAGNONE){ change_val(L(node),tree[node].tag); change_val(R(node),tree[node].tag); tree[node].tag=TAGNONE; } if(tree[node].rev){ change_rev(L(node)); change_rev(R(node)); tree[node].rev=0; } } void rotate(int node){ int fa=F(node); int gfa=F(fa); int z=tree[fa].ch[1]==node; tree[gfa].ch[tree[gfa].ch[1]==fa]=node; tree[node].fa=gfa; tree[fa].ch[z]=tree[node].ch[z^1];tree[tree[node].ch[z^1]].fa=fa; tree[node].ch[z^1]=fa;tree[fa].fa=node; pushup(fa); pushup(node); } void Splay(int node,int goal){ while(tree[node].fa!=goal){ int fa=F(node); int gfa=F(fa); if(gfa!=goal) (compare(fa,tree[node].val))!=(compare(gfa,tree[fa].val)) ?rotate(node) :rotate(fa); rotate(node); } if(!goal)root=node; } void New(int node,int x){ tree[node].middle=tree[node].sum=x; tree[node].tag=TAGNONE;tree[node].rev=0; tree[node].left=tree[node].right=max(x,0); tree[node].size=1; } void build(int begin,int end,int fa){ //建树 int mid=(begin+end)>>1;int node=id[mid],pre=id[fa]; if(begin==end){ New(node,a[begin]); } if(begin<mid)build(begin,mid-1,mid); if(mid<end)build(mid+1,end,mid); tree[node].val=a[mid];tree[node].fa=pre; pushup(node); //printf("%d %d\n",node,tree[node].sum); tree[pre].ch[mid>=fa]=node; } int find(int x,int y){ pushdown(x); int l=L(x),r=R(x); if(tree[l].size+1==y){return x;} if(tree[l].size>=y){return find(l,y);} else{return find(r,y-tree[l].size-1);} } int split(int k,int len){ int x=find(root,k),y=find(root,k+len+1); Splay(x,0);Splay(y,x); return L(y); } void query(int x,int len){ int node=split(x,len); printf("%d\n",tree[node].sum); } void update(int x,int tot,int val){ int node=split(x,tot),y=F(node); change_val(node,val); pushup(y);pushup(F(y)); } void rever(int x,int len){ int node=split(x,len),y=F(node); if(tree[node].tag==TAGNONE){ change_rev(node); pushup(y);pushup(F(y)); } } void eraser(int x,int len){ int node=split(x,len),y=F(node); tree[y].ch[0]=0; pushup(y);pushup(F(y)); } void insert(int k,int len){ for(int i=1;i<=len;i++)scanf("%d",&a[i]); for(int i=1;i<=len;i++){ id[i]=++cnt; } build(1,len,0); int z=id[(1+len)>>1]; int x=find(root,k+1),y=find(root,k+2); Splay(x,0);Splay(y,x); tree[z].fa=y; tree[y].ch[0]=z; pushup(y);pushup(x); } int main(){ int n,m,x; scanf("%d%d",&n,&m); tree[0].middle=a[1]=a[n+2]=-inf; for(int i=1;i<=n;i++)scanf("%d",&x),a[i+1]=x; for(int i=0;i<=n+2;i++)id[i]=i; build(1,n+2,0); root=(n+3)>>1;cnt=n+2; for(int i=1;i<=m;i++){ string s; int x,len,y; cin>>s; if(s!="MAX-SUM")scanf("%d%d",&x,&len); else{ printf("%d\n",tree[root].middle); } if(s=="INSERT")insert(x,len); if(s=="DELETE")eraser(x,len); if(s=="MAKE-SAME"){ scanf("%d",&y); update(x,len,y); } if(s=="REVERSE")rever(x,len); if(s=="GET-SUM")query(x,len); } } ```
by hyfhaha @ 2019-04-17 13:10:13


自动@[大佬](/space/show?uid=54644) @[longlongzhu123](/space/show?uid=57525) @[fmj_123](/space/show?uid=73990) @[command_block](/space/show?uid=58705) @[info___tion](/space/show?uid=76049)
by hyfhaha @ 2019-04-17 13:12:33



by info___tion @ 2019-04-17 13:15:17


~~写作MLE,读作RE~~
by command_block @ 2019-04-17 13:16:02


自动膜拜@**巨佬**@hyfhaha @[longlongzhu123](/space/show?uid=57525) @[command_block](/space/show?uid=58705)
by wxw25 @ 2019-04-17 13:16:08


~~我又不会splay,@我干什么~~
by fmj_123 @ 2019-04-17 13:17:03


我也不会Splay啊QAQ
by longlongzhu123 @ 2019-04-17 13:17:25


@[command_block](/space/show?uid=58705) 但我试过了,主程序都还没运行就已经MLE了
by hyfhaha @ 2019-04-17 13:19:12


……祝你好运
by command_block @ 2019-04-17 13:22:56


写个垃圾回收啊
by command_block @ 2019-04-17 13:23:48


| 下一页