#求助大佬

P3380 【模板】树套树

```cpp #include<iostream> #include<iomanip> #include<stack> #include<queue> #include<list> #include<vector> #include<map> #include<set> #include<string> #include<algorithm> #include<cmath> #include<cstdio> #include<cstring> #define ull unsigned long long #define ll long long #define inf 50009 #define INF 2000003 #define int_max 2147483647 #define int_min -2147483647 #define rd(n) {n=0;char ch;int f=0;do{ch=getchar();if(ch=='-'){f=1;}}while(ch<'0'||ch>'9');while('0'<=ch&&ch<='9'){n=(n<<1)+(n<<3)+ch-48;ch=getchar();}if(f)n=-n;} using namespace std; int arr[inf]; int n; struct Spaly{ int son[2]; int f,siz,fqc; int val; }t[INF]; int sp_cnt; int rt[INF]; inline void SP_pushup(int x){ t[x].siz=t[x].fqc+t[t[x].son[0]].siz+t[t[x].son[1]].siz; return; } inline void SP_rotate(int u,int p){ register int v=t[u].f; t[v].son[!p]=t[u].son[p]; t[t[u].son[p]].f=v; t[u].f=t[v].f; if (t[u].f){ t[t[u].f].son[t[t[u].f].son[1]==v]=u; } t[u].son[p]=v; t[v].f=u; SP_pushup(v); SP_pushup(u); return; } inline void SP_splay(int rid,int u,int to){ while(t[u].f!=to){ if (t[t[u].f].f==to){ SP_rotate(u,t[t[u].f].son[0]==u); } else{ register int f=t[u].f,grandf=t[f].f; register int p=(t[grandf].son[0]==f); if (t[f].son[p]==u){ SP_rotate(u,!p); SP_rotate(u,p); } else{ SP_rotate(f,p); SP_rotate(u,p); } } } if (to==0){ rt[rid]=u; } return; } inline void SP_newtree(int v,int x){ t[x].val=v; t[x].siz=t[x].fqc=1; t[x].son[1]=t[x].son[0]=0; t[x].f=0; return; } inline void SP_insert(int rid,int v,int x){ register int u=rt[rid]; if (!u){ SP_newtree(v,x); rt[rid]=x; return; } while (u){ if (t[u].val==v){ t[u].siz++,t[u].fqc++; SP_splay(rid,u,0); return; } else if (t[u].val<v){ if (!t[u].son[1]){ SP_newtree(v,x); t[u].son[1]=x; t[x].f=u; break; } else{ u=t[u].son[1]; } } else{ if (!t[u].son[0]){ SP_newtree(v,x); t[u].son[0]=x; t[x].f=u; break; } else{ u=t[u].son[0]; } } } SP_splay(rid,x,0); return; } inline int SP_rank(int rid,int k){ register int u=rt[rid],ans=0; while (u){ if (t[u].val==k){ ans+=t[t[u].son[0]].siz; break; } else if (k<t[u].val){ u=t[u].son[0]; } else{ ans+=t[u].fqc+t[t[u].son[0]].siz; u=t[u].son[1]; } } return ans; } inline int SP_find(int root,int x){ register int u=root; while (u){ if (t[u].val==x){ return u; } else if (x<t[u].val){ u=t[u].son[0]; } else{ u=t[u].son[1]; } } return -1; } inline int SP_findmax(int u){ while (t[u].son[1]){ u=t[u].son[1]; } return u; } inline void SP_change(int rid,int x,int y){ register int u=SP_find(rt[rid],x); SP_splay(rid,u,0); if (t[u].fqc>1){ t[u].fqc--; } else if (t[u].siz==1){ rt[rid]=0; } else{ if (!t[u].son[0]){ rt[rid]=t[u].son[1]; t[t[u].son[1]].f=0; } else if (!t[u].son[1]){ rt[rid]=t[u].son[0]; t[t[u].son[0]].f=0; } else{ SP_splay(rid,SP_findmax(t[u].son[0]),u); register int newr=t[u].son[0]; t[newr].son[1]=t[u].son[1]; t[t[u].son[1]].f=newr; t[newr].f=0; rt[rid]=newr; SP_pushup(newr); } } if (t[u].fqc){ SP_insert(rid,y,++sp_cnt); } else{ SP_insert(rid,y,u); } return; } inline int SP_getnext(int rid,int x){ register int u=rt[rid],ans=int_max; while (u){ if (x<t[u].val){ ans=min(ans,t[u].val); u=t[u].son[0]; } else{ u=t[u].son[1]; } } return ans; } inline int SP_getlast(int rid,int x){ register int u=rt[rid],ans=int_min; while (u){ if (x<=t[u].val){ u=t[u].son[0]; } else { ans=max(ans,t[u].val); u=t[u].son[1]; } } return ans; } inline void ST_bulid(int u,int l,int r){ for (int i=l;i<=r;i++){ SP_inser… ```
by ezoixx118 @ 2017-11-26 19:31:48


代码下半段: ```cpp inline void ST_bulid(int u,int l,int r){ for (int i=l;i<=r;i++){ SP_insert(u,arr[i],++sp_cnt); } register int mid=(l+r)>>1; if (l!=r){ ST_bulid(u<<1,l,mid); ST_bulid(u<<1|1,mid+1,r); } return; } inline int ST_rank(int u,int l,int r,int x,int y,int k){ if (x<=l && r<=y){ return SP_rank(u,k); } register int ans=0,mid=(l+r)>>1; if (x<=mid){ ans+=ST_rank(u<<1,l,mid,x,y,k); } if (y>mid){ ans+=ST_rank(u<<1|1,mid+1,r,x,y,k); } return ans; } inline int Binary_Search(int x,int y,int k){ int l=0,r=(int)1e8+1; while (l<r){ register int mid=(l+r)>>1; if (ST_rank(1,1,n,x,y,mid)<k){ l=mid+1; } else{ r=mid; } } return l-1; } inline void ST_change(int u,int l,int r,int x,int v){ SP_change(u,arr[x],v); if (l==r){ arr[x]=v; return; } register int mid=(l+r)>>1; if (x<=mid){ ST_change(u<<1,l,mid,x,v); } else{ ST_change(u<<1|1,mid+1,r,x,v); } return; } inline int ST_last(int u,int l,int r,int x,int y,int k){ if (x<=l && r<=y){ return SP_getlast(u,k); } register int ans=int_min,mid=(l+r)>>1; if (x<=mid){ ans=max(ans,ST_last(u<<1,l,mid,x,y,k)); } if (y>mid){ ans=max(ans,ST_last(u<<1|1,mid+1,r,x,y,k)); } return ans; } inline int ST_next(int u,int l,int r,int x,int y,int k){ if (x<=l && r<=y){ return SP_getnext(u,k); } register int ans=int_max,mid=(l+r)>>1; if (x<=mid){ ans=min(ans,ST_next(u<<1,l,mid,x,y,k)); } if (y>mid){ ans=min(ans,ST_next(u<<1|1,mid+1,r,x,y,k)); } return ans; } inline void wr(int x){ if(x<0){ putchar('-'),x=-x; } if(x>9){ wr(x/10); } putchar(x%10+'0'); return; } int main(){ int m; rd(n);rd(m); for (register int i=1;i<=n;i++){ rd(arr[i]); } ST_bulid(1,1,n); int p,x,y,k; for (register int i=1;i<=m;i++){ rd(p); if (p==1){ rd(x);rd(y);rd(k); wr(ST_rank(1,1,n,x,y,k)+1); putchar('\n'); } else if (p==2){ rd(x);rd(y);rd(k); wr(Binary_Search(x,y,k)); putchar('\n'); } else if (p==3){ rd(x);rd(k); ST_change(1,1,n,x,k); } else if (p==4){ rd(x);rd(y);rd(k); wr(ST_last(1,1,n,x,y,k)); putchar('\n'); } else{ rd(x);rd(y);rd(k); wr(ST_next(1,1,n,x,y,k)); putchar('\n'); } } return 0; } ```
by ezoixx118 @ 2017-11-26 19:33:36


您听说过大牛分站吗
by wjy666 @ 2017-11-26 20:59:07


@[wjy666](/space/show?uid=20821) 然后呢
by ezoixx118 @ 2017-11-27 18:53:14


@[ezoixx118](/space/show?uid=30541) 大牛分站开O2优化
by wjy666 @ 2017-11-27 19:12:09


@[wjy666](/space/show?uid=20821) 啊!谢谢,卡过去了。。
by ezoixx118 @ 2017-11-28 18:54:35


|