萌新求助卡常

P1110 [ZJOI2007] 报表统计

STO Meatherm orz
by SisconHL @ 2020-01-31 22:42:27


Meatherm Orz
by ieeqwq @ 2020-01-31 22:46:33


用 cin 读入 string?还行 @[Meatherm](/user/108949)
by ieeqwq @ 2020-01-31 22:49:55


@[wzsCD](/user/127284) 于是我改了一发2333 ```cpp # include <bits/stdc++.h> # define rr register # define lc(x) tree[x].son[0] # define rc(x) tree[x].son[1] const int N=500010; struct Node{ int val; int lval,rval; int minx; int son[2]; int rnd; int size; }tree[N*8]; int st[N],en[N]; int cnt; int rta; int rtv; int n,m; inline int read(void){ int res,f=1; char c; while((c=getchar())<'0'||c>'9') if(c=='-')f=-1; res=c-48; while((c=getchar())>='0'&&c<='9') res=res*10+c-48; return res*f; } inline int abs(int x){ return x>0?x:-x; } /*inline int& lc(int x){ return tree[x].son[0]; } inline int& rc(int x){ return tree[x].son[1]; }*/ inline void update(int x){ tree[x].minx=1e9; if(lc(x)) tree[x].lval=tree[lc(x)].lval,tree[x].minx=std::min(tree[x].minx,std::min(tree[lc(x)].minx,abs(tree[x].val-tree[lc(x)].rval))); else tree[x].lval=tree[x].val; if(rc(x)) tree[x].rval=tree[rc(x)].rval,tree[x].minx=std::min(tree[x].minx,std::min(tree[rc(x)].minx,abs(tree[x].val-tree[rc(x)].lval))); else tree[x].rval=tree[x].val; // tree[x].minx=std::min(std::min(tree[lc(x)].minx,tree[rc(x)].minx),std::min(abs(tree[x].val-tree[rc(x)].lval),abs(tree[x].val-tree[lc(x)].rval))); tree[x].size=tree[lc(x)].size+tree[rc(x)].size+1; return; } inline void NewNode(int &x,int v){ x=++cnt; tree[x].lval=tree[x].rval=tree[x].val=v; tree[x].minx=1e9; tree[x].rnd=rand(); tree[x].size=1; return; } void split(int now,int v,int &x,int &y){ if(!now){ x=y=0; return; } // update(now); if(tree[now].val<=v){ x=now; split(rc(now),v,rc(x),y); update(x); }else{ y=now; split(lc(now),v,x,lc(y)); update(y); } return; } void merge(int &now,int x,int y){ if(!x||!y){ now=x|y; return; } // update(x),update(y); if(tree[x].rnd<tree[y].rnd){ now=x; merge(rc(now),rc(x),y); update(now); }else{ now=y; merge(lc(now),x,lc(y)); update(now); } return; } inline void Insert(int &rt,int v){ int x,a,b; NewNode(x,v); split(rt,v,a,b); merge(a,a,x); merge(rt,a,b); return; } inline void Delete(int &rt,int v){ int a,b,c,d; split(rt,v-1,a,b); split(b,v,c,d); merge(c,lc(c),rc(c)); merge(b,c,d); merge(rt,a,b); return; } inline int getans(int x){ while(lc(x)){ x=lc(x); } return tree[x].val; } void prints(int x){ if(x<0) putchar('-'),x=-x; if(x>9) prints(x/10); putchar(x%10+'0'); return; } int main(void){ srand(114514); tree[0].minx=1e9; tree[0].lval=tree[0].rval=tree[0].val=1e9; n=read(),m=read(); for(rr int i=1;i<=n;++i){ st[i]=en[i]=read(); if(i>1) Insert(rta,abs(st[i]-st[i-1])); Insert(rtv,st[i]); } /* puts("Seque a is"); print(rtv); puts(""); puts("Seque b is"); print(rta); puts("");*/ char opt[10]; int x,v; while(m--){ scanf("%s",opt); if(opt[0]=='I'){ x=read(),v=read(); if(x<n) Delete(rta,abs(st[x+1]-en[x])),Insert(rta,abs(st[x+1]-v)); Insert(rta,abs(en[x]-v)); Insert(rtv,v); en[x]=v; }else if(opt[4]=='G'){ prints(getans(rta)); puts(""); }else{ prints(tree[rtv].minx); puts(""); } /* puts("Seque a is"); print(rtv); puts(""); puts("Seque b is"); print(rta); puts(""); */ } return 0; } ``` 加 O2 85,不加 70 /kk
by Meatherm @ 2020-01-31 22:51:02


% Meatherm
by tiger0133 @ 2020-01-31 23:00:35


@[Meatherm](/user/108949) 太 草 了 帮您卡过了 ```cpp # include <bits/stdc++.h> # define lc(x) tree[x].son[0] # define rc(x) tree[x].son[1] #pragma GCC optimize(3) #pragma GCC optimize("Ofast") #pragma GCC optimize("inline") const int N=500010; struct Node{ int val; int lval,rval; int minx; int son[2]; int rnd; int size; }tree[N<<3]; int st[N],en[N]; int cnt; int rta; int rtv; int n,m; inline int min(register int a,register int b) { return a<b?a:b; } inline int read(void){ int res,f=1; char c; while((c=getchar())<'0'||c>'9') if(c=='-')f=-1; res=c-48; while((c=getchar())>='0'&&c<='9') res=(res<<3)+(res<<1)+(c^48); return res*f; } inline int abs(register int x){ return x>0?x:-x; } /*inline int& lc(int x){ return tree[x].son[0]; } inline int& rc(int x){ return tree[x].son[1]; }*/ inline void update(register int x){ tree[x].minx=1e9; if(lc(x)) tree[x].lval=tree[lc(x)].lval,tree[x].minx=min(tree[x].minx,min(tree[lc(x)].minx,abs(tree[x].val-tree[lc(x)].rval))); else tree[x].lval=tree[x].val; if(rc(x)) tree[x].rval=tree[rc(x)].rval,tree[x].minx=min(tree[x].minx,min(tree[rc(x)].minx,abs(tree[x].val-tree[rc(x)].lval))); else tree[x].rval=tree[x].val; // tree[x].minx=std::min(std::min(tree[lc(x)].minx,tree[rc(x)].minx),std::min(abs(tree[x].val-tree[rc(x)].lval),abs(tree[x].val-tree[lc(x)].rval))); tree[x].size=tree[lc(x)].size+tree[rc(x)].size+1; return; } inline void NewNode(register int &x,register int v){ x=++cnt; tree[x].lval=tree[x].rval=tree[x].val=v; tree[x].minx=1e9; tree[x].rnd=rand(); tree[x].size=1; return; } void split(register int now,register int v,register int &x,register int &y){ if(!now){ x=y=0; return; } // update(now); if(tree[now].val<=v){ x=now; split(rc(now),v,rc(x),y); update(x); }else{ y=now; split(lc(now),v,x,lc(y)); update(y); } return; } void merge(register int &now,register int x,register int y){ if(!x||!y){ now=x|y; return; } // update(x),update(y); if(tree[x].rnd<tree[y].rnd){ now=x; merge(rc(now),rc(x),y); update(now); }else{ now=y; merge(lc(now),x,lc(y)); update(now); } return; } inline void Insert(register int &rt,register int v){ int x,a,b; NewNode(x,v); split(rt,v,a,b); merge(a,a,x); merge(rt,a,b); return; } inline void Delete(register int &rt,register int v){ int a,b,c,d; split(rt,v-1,a,b); split(b,v,c,d); merge(c,lc(c),rc(c)); merge(b,c,d); merge(rt,a,b); return; } inline int getans(register int x){ while(lc(x)){ x=lc(x); } return tree[x].val; } void prints(register int x){ if(x<0) putchar('-'),x=-x; if(x>9) prints(x/10); putchar(x%10+'0'); return; } int main(void){ srand(114514); tree[0].minx=1e9; tree[0].lval=tree[0].rval=tree[0].val=1e9; n=read(),m=read(); for(register int i=1;i<=n;++i){ st[i]=en[i]=read(); if(i>1) Insert(rta,abs(st[i]-st[i-1])); Insert(rtv,st[i]); } /* puts("Seque a is"); print(rtv); puts(""); puts("Seque b is"); print(rta); puts("");*/ char opt[10]; register int x,v; while(m--){ scanf("%s",opt); if(opt[0]=='I'){ x=read(),v=read(); if(x<n) Delete(rta,abs(st[x+1]-en[x])),Insert(rta,abs(st[x+1]-v)); Insert(rta,abs(en[x]-v)); Insert(rtv,v); en[x]=v; }else if(opt[4]=='G'){ prints(getans(rta)); putchar('\n'); }else{ prints(tree[rtv].minx); putchar('\n'); } /* puts("Seque a is"); print(rtv); puts(""); puts("Seque b is"); print(rta); puts(""); */ } return 0; } ```
by ⚡小林孑⚡ @ 2020-01-31 23:03:16


% $\rm M\color{red}eatherm$
by XeCtera @ 2020-01-31 23:14:30


@[脱发自动机](/user/119959) 太强了 %%%
by Meatherm @ 2020-02-01 09:11:15


@[Meatherm](/user/108949) fAKe
by ⚡小林孑⚡ @ 2020-02-01 21:38:52


|