Splay 专辑
Splay写的真是抑郁,各种被坑。。。
被题坑,被自己坑。
一直在调程序。。。
Splay模板:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cstdio> 6 7 #define N 170000 8 #define INF 2e9 9 10 using namespace std; 11 12 int son[N][2],fa[N],val[N],sum[N]; 13 int n,m,ans,a,w,root,cnt; 14 15 inline void prt(int x,int dp)//调试专用,用不上最好 16 { 17 if(!x) return; 18 prt(son[x][0],dp+1); printf("%d %d\n",val[x],dp); prt(son[x][1],dp+1); 19 } 20 21 inline void pushup(int x) 22 { 23 sum[x]=sum[son[x][0]]+sum[son[x][1]]+1; 24 } 25 26 inline void link(int x,int y,int c)//c=0 left c=1 right 27 { 28 fa[x]=y; 29 son[y][c]=x; 30 } 31 32 void rotate(int x,int c)//c=0 left c=1 right 33 { 34 int y=fa[x]; 35 link(x,fa[y],son[fa[y]][1]==y); 36 link(son[x][!c],y,c); 37 link(y,x,!c); 38 pushup(y); 39 } 40 41 void splay(int x,int g) 42 { 43 while(fa[x]!=g) 44 { 45 int y=fa[x]; 46 int cy=(son[fa[y]][1]==y),cx=(son[y][1]==x); 47 if(fa[y]==g) rotate(x,cx); 48 else 49 { 50 if(cx==cy) rotate(y,cy); 51 else rotate(x,cx); 52 rotate(x,cy); 53 } 54 } 55 pushup(x); 56 if(!g) root=x; 57 } 58 59 void newnode(int y,int &x,int sp) 60 { 61 x=++cnt; 62 fa[x]=y; val[x]=sp; sum[x]=1; 63 son[x][0]=son[x][1]=0; 64 } 65 66 void init() 67 { 68 newnode(cnt=0,root,-INF); 69 newnode(root,son[root][1],INF); 70 sum[root]=2; 71 } 72 73 void insert(int sp) 74 { 75 int x=root; 76 while(son[x][val[x]<sp]) x=son[x][val[x]<sp]; 77 newnode(x,son[x][val[x]<sp],sp); 78 splay(cnt,0); 79 } 80 81 int pred(int sp) 82 { 83 int x=root,rt=-INF; 84 while(x) 85 { 86 if(val[x]==sp) return sp; 87 if(val[x]<sp) rt=max(rt,val[x]); 88 x=son[x][val[x]<sp]; 89 } 90 return rt; 91 } 92 93 int succ(int sp) 94 { 95 int x=root,rt=INF; 96 while(x) 97 { 98 if(val[x]==sp) return sp; 99 if(val[x]>sp) rt=min(rt,val[x]); 100 x=son[x][val[x]<sp]; 101 } 102 return rt; 103 } 104 105 int find(int sp) 106 { 107 int x=root,rt=0; 108 while(x) 109 { 110 if(val[x]==sp) rt=x; 111 x=son[x][val[x]<sp]; 112 } 113 return rt; 114 } 115 116 int del(int sp)//return the total number of the deleted numbers 区间删除 117 { 118 int x=find(sp),rt=0; 119 if(x) 120 { 121 splay(1,0); 122 splay(x,1); 123 rt=sum[son[x][0]]; 124 son[x][0]=0;//delete (0,val[x]) 125 splay(x,0); 126 } 127 return rt; 128 } 129 130 inline void DEL(int sp)//单点删除 一个sp值的点 131 { 132 int x=find(sp); 133 splay(x,0); 134 if(son[x][0]&&son[x][1]) 135 { 136 int y=getmax(son[x][0]); 137 splay(y,x); 138 fa[y]=0; root=y; fa[son[x][1]]=root; son[y][1]=son[x][1]; 139 pushup(y); 140 } 141 else if(son[x][0]) fa[son[x][0]]=0,root=son[x][0]; 142 else if(son[x][1]) fa[son[x][1]]=0,root=son[x][1]; 143 } 144 145 int select(int k,int g)//return the value of the kth largest number 146 { 147 int x=root; 148 while(sum[son[x][1]]!=k) 149 { 150 if(sum[son[x][1]]>k) x=son[x][1]; 151 else k=k-sum[son[x][1]]-1,x=son[x][0]; 152 } 153 splay(x,g); 154 return val[x]; 155 } 156 157 void go() 158 { 159 char str[10]; 160 init(); 161 ans=w=0; 162 while(n--) 163 { 164 scanf("%s%d",str,&a); 165 if(str[0]=='I') 166 { 167 a-=w; 168 if(a>=m-w) insert(a); 169 } 170 else if(str[0]=='A') w+=a; 171 else if(str[0]=='S') 172 { 173 w-=a; 174 ans+=del(succ(m-w)); 175 } 176 else if(str[0]=='F') 177 { 178 if(sum[root]<a+2) puts("-1"); 179 else printf("%d\n",select(a,0)+w); 180 } 181 } 182 printf("%d\n",ans); 183 } 184 185 int main() 186 { 187 while(~scanf("%d%d",&n,&m)) go(); 188 return 0; 189 }
BZOJ 1503:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 7 #define INF 1e9 8 #define N 1000000 9 10 using namespace std; 11 12 int fa[N],son[N][2],sz[N],val[N]; 13 int n,cnt,root,ans,dt,mn; 14 15 inline void pushup(int x) 16 { 17 sz[x]=sz[son[x][0]]+sz[son[x][1]]+1; 18 } 19 20 inline void link(int x,int y,int c) 21 { 22 fa[x]=y; son[y][c]=x; 23 } 24 25 inline void rotate(int x,int c) 26 { 27 int y=fa[x]; 28 link(x,fa[y],son[fa[y]][1]==y); 29 link(son[x][!c],y,c); 30 link(y,x,!c); 31 pushup(y); 32 } 33 34 inline void splay(int x,int g) 35 { 36 while(fa[x]!=g) 37 { 38 int y=fa[x]; 39 int cy=(son[fa[y]][1]==y),cx=(son[y][1]==x); 40 if(fa[y]==g) rotate(x,cx); 41 else 42 { 43 if(cx==cy) rotate(y,cy); 44 else rotate(x,cx); 45 rotate(x,cy); 46 } 47 } 48 pushup(x); 49 if(!g) root=x; 50 } 51 52 inline void newnode(int y,int &x,int sp) 53 { 54 x=++cnt; 55 fa[x]=y; val[x]=sp; sz[x]=1; 56 son[x][0]=son[x][1]=0; 57 } 58 59 inline void init() 60 { 61 cnt=0; 62 newnode(0,root,-INF); 63 newnode(root,son[root][1],INF); 64 sz[root]=2; 65 } 66 67 inline void insert(int sp) 68 { 69 int x=root; 70 while(son[x][sp>val[x]]) x=son[x][sp>val[x]]; 71 newnode(x,son[x][sp>val[x]],sp); 72 splay(cnt,0); 73 } 74 75 inline int find(int sp) 76 { 77 int x=root,res=0; 78 while(x) 79 { 80 if(val[x]==sp) res=x; 81 x=son[x][sp>val[x]]; 82 } 83 return res; 84 } 85 86 inline int del(int sp) 87 { 88 int x=find(sp),res=0; 89 if(x) 90 { 91 splay(1,0); 92 splay(x,1); 93 res=sz[son[x][0]]; 94 son[x][0]=0; 95 splay(x,0); 96 } 97 return res; 98 } 99 100 inline int succ(int sp) 101 { 102 int x=root,res=INF; 103 while(x) 104 { 105 if(val[x]==sp) return sp; 106 if(sp<val[x]) res=min(res,val[x]); 107 x=son[x][sp>val[x]]; 108 } 109 return res; 110 } 111 112 inline int select(int k,int g) 113 { 114 int x=root; 115 while(sz[son[x][1]]!=k) 116 { 117 if(k<sz[son[x][1]]) x=son[x][1]; 118 else k-=sz[son[x][1]]+1,x=son[x][0]; 119 } 120 splay(x,g); 121 return val[x]; 122 } 123 124 inline void go() 125 { 126 init(); 127 scanf("%d%d",&n,&mn); 128 ans=dt=0; 129 char str[10];int a; 130 while(n--) 131 { 132 scanf("%s%d",str,&a); 133 if(str[0]=='I') 134 { 135 a-=dt; 136 if(a>=mn-dt) insert(a); 137 } 138 else if(str[0]=='A') dt+=a; 139 else if(str[0]=='S') 140 { 141 dt-=a; 142 ans+=del(succ(mn-dt)); 143 } 144 else 145 { 146 if(sz[root]-2<a) puts("-1"); 147 else printf("%d\n",select(a,0)+dt); 148 } 149 } 150 printf("%d\n",ans); 151 } 152 153 int main() 154 { 155 go(); 156 return 0; 157 }
BZOJ 1588:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 7 #define INF 1e9 8 #define N 1000000 9 10 using namespace std; 11 12 int son[N][2],fa[N],sz[N],val[N]; 13 int n,cnt,root,ans; 14 15 16 inline void pushup(int x) 17 { 18 sz[x]=sz[son[x][0]]+sz[son[x][1]]+1; 19 } 20 21 inline void link(int x,int y,int c) 22 { 23 fa[x]=y; son[y][c]=x; 24 } 25 26 inline void rotate(int x,int c) 27 { 28 int y=fa[x]; 29 link(x,fa[y],son[fa[y]][1]==y); 30 link(son[x][!c],y,c); 31 link(y,x,!c); 32 pushup(y); 33 } 34 35 inline void splay(int x,int g) 36 { 37 while(fa[x]!=g) 38 { 39 int y=fa[x]; 40 int cy=(son[fa[y]][1]==y),cx=(son[y][1]==x); 41 if(fa[y]==g) rotate(x,cx); 42 else 43 { 44 if(cx==cy) rotate(y,cy); 45 else rotate(x,cx); 46 rotate(x,cy); 47 } 48 } 49 pushup(x); 50 if(!g) root=x; 51 } 52 53 inline void newnode(int y,int &x,int sp) 54 { 55 x=++cnt; 56 fa[x]=y; val[x]=sp; sz[x]=1; 57 son[x][0]=son[x][1]=0; 58 } 59 60 inline void init() 61 { 62 cnt=0; 63 newnode(0,root,-INF); 64 newnode(root,son[root][1],INF); 65 sz[root]=2; 66 } 67 68 inline void insert(int sp) 69 { 70 int x=root; 71 while(son[x][sp>val[x]]) x=son[x][sp>val[x]]; 72 newnode(x,son[x][sp>val[x]],sp); 73 splay(cnt,0); 74 } 75 76 inline int pred(int sp) 77 { 78 int x=root,res=-INF; 79 while(x) 80 { 81 if(val[x]==sp) return sp; 82 if(val[x]<sp) res=max(res,val[x]); 83 x=son[x][sp>val[x]]; 84 } 85 return res; 86 } 87 88 inline int succ(int sp) 89 { 90 int x=root,res=INF; 91 while(x) 92 { 93 if(val[x]==sp) return sp; 94 if(val[x]>sp) res=min(res,val[x]); 95 x=son[x][sp>val[x]]; 96 } 97 return res; 98 } 99 100 inline void go() 101 { 102 init(); 103 scanf("%d%d",&n,&ans);insert(ans); 104 for(int i=2,a;i<=n;i++) 105 { 106 if(scanf("%d",&a)==EOF) a=0; 107 int f1=pred(a); 108 int f2=succ(a); 109 ans+=min(f2-a,a-f1); 110 insert(a); 111 } 112 printf("%d\n",ans); 113 } 114 115 int main() 116 { 117 go(); 118 return 0; 119 }
HDU 1754:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdio> 5 #include <cstdlib> 6 7 #define N 1000000 8 #define INF 1e9 9 10 using namespace std; 11 12 int son[N][2],val[N],bh[N],fa[N],mx[N]; 13 int n,cnt,root,m; 14 15 inline void prt(int x,int dp) 16 { 17 if(!x) return; 18 prt(son[x][0],dp+1); printf("%d %d\n",val[x],dp); prt(son[x][1],dp+1); 19 } 20 21 inline void pushup(int x) 22 { 23 mx[x]=max(val[x],max(mx[son[x][0]],mx[son[x][1]])); 24 } 25 26 inline void link(int x,int y,int c) 27 { 28 fa[x]=y; son[y][c]=x; 29 } 30 31 inline void rotate(int x,int c) 32 { 33 int y=fa[x]; 34 link(x,fa[y],son[fa[y]][1]==y); 35 link(son[x][!c],y,c); 36 link(y,x,!c); 37 pushup(y); 38 } 39 40 inline void splay(int x,int g) 41 { 42 while(fa[x]!=g) 43 { 44 int y=fa[x]; 45 int cy=(son[fa[y]][1]==y),cx=(son[y][1]==x); 46 if(fa[y]==g) rotate(x,cx); 47 else 48 { 49 if(cx==cy) rotate(y,cy); 50 else rotate(x,cx); 51 rotate(x,cy); 52 } 53 } 54 pushup(x); 55 if(!g) root=x; 56 } 57 58 inline void newnode(int y,int &x,int sp,int b)//细节 59 { 60 x=++cnt; 61 fa[x]=y; val[x]=sp; bh[x]=b; 62 son[x][0]=son[x][1]=0; 63 } 64 65 inline void init() 66 { 67 cnt=0; 68 newnode(0,root,-INF,0); 69 newnode(root,son[root][1],INF,n+1); 70 } 71 72 inline void insert(int sp,int b) 73 { 74 int x=root; 75 while(son[x][b>bh[x]]) x=son[x][b>bh[x]]; 76 newnode(x,son[x][b>bh[x]],sp,b); 77 splay(cnt,0);//细节 78 } 79 80 inline int getpos(int b) 81 { 82 int x=root; 83 while(x) 84 { 85 if(bh[x]==b) return x; 86 x=son[x][b>bh[x]]; 87 } 88 } 89 90 inline void querymax(int l,int r) 91 { 92 int f1=getpos(l-1); 93 int f2=getpos(r+1); 94 splay(f1,0);splay(f2,f1); 95 printf("%d\n",mx[son[f2][0]]); 96 } 97 98 inline void change(int b,int sp) 99 { 100 int f1=getpos(b); 101 splay(f1,0); val[f1]=sp; 102 pushup(f1); 103 } 104 105 inline void go() 106 { 107 init();mx[0]=-INF; 108 for(int i=1,a;i<=n;i++) 109 { 110 scanf("%d",&a); 111 insert(a,i); 112 } 113 //prt(root,0); 114 char str[10]; 115 for(int i=1,a,b;i<=m;i++) 116 { 117 scanf("%s%d%d",str,&a,&b); 118 if(str[0]=='Q') 119 { 120 if(a>b) swap(a,b); 121 querymax(a,b); 122 } 123 else change(a,b); 124 } 125 } 126 127 int main() 128 { 129 while(scanf("%d%d",&n,&m)!=EOF) go(); 130 return 0; 131 }
HDU 1890:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <algorithm> 6 7 #define N 1000000 8 #define BUG system("pause") 9 10 using namespace std; 11 12 struct PX 13 { 14 int nu,id; 15 }px[N]; 16 17 int id[N],pos[N],son[N][2],fa[N],rev[N],sz[N]; 18 int cnt,root,n; 19 20 inline bool cmp(const PX &a,const PX &b) 21 { 22 if(a.nu!=b.nu) return a.nu<b.nu; 23 return a.id<b.id; 24 } 25 26 inline bool cmp1(const PX &a,const PX &b) 27 { 28 return a.id<b.id; 29 } 30 31 inline void pushup(int x) 32 { 33 sz[x]=sz[son[x][0]]+sz[son[x][1]]+1; 34 } 35 36 inline void reverse(int x) 37 { 38 if(!x) return; 39 rev[x]^=1; 40 } 41 42 inline void pushdown(int x) 43 { 44 if(!x||!rev[x]) return; 45 rev[x]=0; 46 reverse(son[x][0]); 47 reverse(son[x][1]); 48 swap(son[x][0],son[x][1]); 49 } 50 51 inline void link(int x,int y,int c) 52 { 53 fa[x]=y; son[y][c]=x; 54 } 55 56 inline void rotate(int x,int c) 57 { 58 int y=fa[x]; 59 pushdown(y); 60 pushdown(x); 61 link(x,fa[y],son[fa[y]][1]==y); 62 link(son[x][!c],y,c); 63 link(y,x,!c); 64 pushup(y); 65 } 66 67 inline void splay(int x,int g) 68 { 69 pushdown(x); 70 while(fa[x]!=g) 71 { 72 int y=fa[x]; 73 pushdown(fa[y]); pushdown(y); pushdown(x); 74 int cy=(son[fa[y]][1]==y),cx=(son[y][1]==x); 75 if(fa[y]==g) rotate(x,cx); 76 else 77 { 78 if(cx==cy) rotate(y,cy); 79 else rotate(x,cx); 80 rotate(x,cy); 81 } 82 } 83 pushup(x); 84 if(!g) root=x; 85 } 86 87 inline void newnode(int y,int &x) 88 { 89 x=++cnt; 90 fa[x]=y; sz[x]=1; rev[x]=0; 91 son[x][0]=son[x][1]=0; 92 } 93 94 inline void init() 95 { 96 cnt=0; 97 newnode(0,root); 98 newnode(root,son[root][1]); 99 sz[root]=2; 100 } 101 102 inline int getmax(int x)//在任何有pushdown的操作中,从上向下时必须提前pushdown! 103 { 104 pushdown(x); 105 while(son[x][1]) 106 { 107 x=son[x][1]; 108 pushdown(x); 109 } 110 return x; 111 } 112 113 inline void del() 114 { 115 int x=root; 116 if(son[x][0]&&son[x][1]) 117 { 118 int y=getmax(son[x][0]); 119 splay(y,x); 120 fa[y]=0; root=y; fa[son[x][1]]=root; son[y][1]=son[x][1]; 121 pushup(y); 122 } 123 else if(son[x][0]) fa[son[x][0]]=0,root=son[x][0]; 124 else if(son[x][1]) fa[son[x][1]]=0,root=son[x][1]; 125 } 126 127 inline void build(int &x,int l,int r,int g) 128 { 129 if(l>r) return; 130 int mid=(l+r)>>1; 131 newnode(g,x); 132 pos[id[mid]]=x; 133 build(son[x][0],l,mid-1,x); 134 build(son[x][1],mid+1,r,x); 135 pushup(x); 136 } 137 138 inline void go() 139 { 140 init(); 141 for(int i=1;i<=n;i++) 142 { 143 scanf("%d",&px[i].nu); 144 px[i].id=i; 145 } 146 sort(px+1,px+1+n,cmp); 147 for(int i=1;i<=n;i++) id[px[i].id]=i; 148 sort(px+1,px+1+n,cmp1); 149 build(son[son[root][1]][0],1,n,son[root][1]); 150 pushup(son[root][1]); 151 pushup(root); 152 for(int i=1;i<=n;i++) 153 { 154 splay(pos[i],0); splay(1,pos[i]); 155 printf("%d",i+sz[son[1][1]]); 156 if(i<n) printf(" "); 157 rev[son[1][1]]^=1; 158 del(); 159 } 160 puts(""); 161 } 162 163 int main() 164 { 165 while(scanf("%d",&n),n) go(); 166 return 0; 167 }
BZOJ 1208:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <algorithm> 6 7 #define mod 1000000 8 #define N 1000000 9 #define INF 1e9 10 11 using namespace std; 12 13 int son[N][2],sz[N],val[N],fa[N]; 14 int n,root,cnt,people,ans; 15 16 17 inline void prt(int x,int dp) 18 { 19 if(!x) return; 20 prt(son[x][0],dp+1); printf("%d %d\n",val[x],dp); prt(son[x][1],dp+1); 21 } 22 23 inline void pushup(int x) 24 { 25 sz[x]=sz[son[x][0]]+sz[son[x][1]]+1; 26 } 27 28 inline void link(int x,int y,int c) 29 { 30 fa[x]=y; son[y][c]=x; 31 } 32 33 inline void rotate(int x,int c) 34 { 35 int y=fa[x]; 36 link(x,fa[y],son[fa[y]][1]==y); 37 link(son[x][!c],y,c); 38 link(y,x,!c); 39 pushup(y); 40 } 41 42 inline void splay(int x,int g) 43 { 44 while(fa[x]!=g) 45 { 46 int y=fa[x]; 47 int cy=(son[fa[y]][1]==y),cx=(son[y][1]==x); 48 if(fa[y]==g) rotate(x,cx); 49 else 50 { 51 if(cx==cy) rotate(y,cy); 52 else rotate(x,cx); 53 rotate(x,cy); 54 } 55 } 56 pushup(x); 57 if(!g) root=x; 58 } 59 60 inline void newnode(int y,int &x,int sp) 61 { 62 x=++cnt; 63 fa[x]=y; val[x]=sp; sz[x]=1; 64 son[x][0]=son[x][1]=0; 65 } 66 67 inline void init() 68 { 69 cnt=0; 70 newnode(0,root,-INF); 71 newnode(root,son[root][1],INF); 72 sz[root]=2; 73 } 74 75 inline void insert(int sp) 76 { 77 int x=root; 78 while(son[x][sp>val[x]]) x=son[x][sp>val[x]]; 79 newnode(x,son[x][sp>val[x]],sp); 80 splay(cnt,0); 81 } 82 83 inline int pred(int sp) 84 { 85 int x=root,res=-INF; 86 while(x) 87 { 88 if(sp==val[x]) res=val[x]; 89 else if(sp>val[x]) res=max(res,val[x]); 90 x=son[x][sp>val[x]]; 91 } 92 return res; 93 } 94 95 inline int succ(int sp) 96 { 97 int x=root,res=INF; 98 while(x) 99 { 100 if(sp==val[x]) res=val[x]; 101 else if(sp<val[x]) res=min(res,val[x]); 102 x=son[x][sp>val[x]]; 103 } 104 return res; 105 } 106 107 inline int getmax(int x) 108 { 109 while(son[x][1]) x=son[x][1]; 110 return x; 111 } 112 113 inline int find(int sp) 114 { 115 int x=root,res=0; 116 while(x) 117 { 118 if(val[x]==sp) res=x; 119 x=son[x][sp>val[x]]; 120 } 121 return res; 122 } 123 124 inline void del(int sp)//单点删除 125 { 126 int x=find(sp); 127 splay(x,0); 128 if(son[x][0]&&son[x][1]) 129 { 130 int y=getmax(son[x][0]); 131 splay(y,x); 132 fa[y]=0; root=y; fa[son[x][1]]=root; son[y][1]=son[x][1]; 133 pushup(y); 134 } 135 else if(son[x][0]) fa[son[x][0]]=0,root=son[x][0]; 136 else if(son[x][1]) fa[son[x][1]]=0,root=son[x][1]; 137 } 138 139 inline void go() 140 { 141 init(); 142 scanf("%d",&n); 143 int pd,da; 144 while(n--) 145 { 146 scanf("%d%d",&pd,&da); 147 if(sz[root]==2||pd==people) 148 { 149 people=pd; 150 insert(da); 151 continue; 152 } 153 int f1=pred(da); 154 int f2=succ(da); 155 if(da-f1<=f2-da) ans+=(da-f1)%mod,del(f1); 156 else ans+=(f2-da)%mod,del(f2); 157 ans%=mod; 158 } 159 printf("%d\n",ans); 160 } 161 162 int main() 163 { 164 go(); 165 return 0; 166 }
BZOJ 1269:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <algorithm> 6 7 #define N 5000000 8 9 using namespace std; 10 11 int sz[N],son[N][2],fa[N]; 12 char val[N]; 13 bool rev[N]; 14 int m,root,cnt,gb; 15 char str[N]; 16 17 inline void pushup(int x) 18 { 19 sz[x]=sz[son[x][0]]+sz[son[x][1]]+1; 20 } 21 22 inline void reverse(int x) 23 { 24 if(!x) return; 25 rev[x]^=1; 26 } 27 28 inline void pushdown(int x) 29 { 30 if(!x||!rev[x]) return; 31 rev[x]=0; 32 reverse(son[x][0]); 33 reverse(son[x][1]); 34 swap(son[x][0],son[x][1]); 35 } 36 37 inline void link(int x,int y,int c) 38 { 39 fa[x]=y; son[y][c]=x; 40 } 41 42 inline void rotate(int x,int c) 43 { 44 int y=fa[x]; 45 pushdown(y); 46 pushdown(x); 47 link(x,fa[y],son[fa[y]][1]==y); 48 link(son[x][!c],y,c); 49 link(y,x,!c); 50 pushup(y); 51 } 52 53 inline void splay(int x,int g) 54 { 55 while(fa[x]!=g) 56 { 57 int y=fa[x]; 58 pushdown(fa[y]); pushdown(y); pushdown(x); 59 int cy=(son[fa[y]][1]==y),cx=(son[y][1]==x); 60 if(fa[y]==g) rotate(x,cx); 61 else 62 { 63 if(cx==cy) rotate(y,cy); 64 else rotate(x,cx); 65 rotate(x,cy); 66 } 67 } 68 pushup(x); 69 if(!g) root=x; 70 } 71 72 inline void newnode(int y,int &x,char b) 73 { 74 x=++cnt; 75 fa[x]=y; sz[x]=1; val[x]=b; 76 son[x][0]=son[x][1]=0; 77 } 78 79 inline void init() 80 { 81 cnt=0; 82 newnode(0,root,'~'); 83 newnode(root,son[root][1],'!'); 84 sz[root]=2; 85 } 86 87 inline void build(int &x,int l,int r,int g) 88 { 89 if(l>r) return; 90 int mid=(l+r)>>1; 91 newnode(g,x,str[mid]); 92 build(son[x][0],l,mid-1,x); 93 build(son[x][1],mid+1,r,x); 94 pushup(x); 95 } 96 97 inline int find(int b) 98 { 99 int x=root; 100 pushdown(x); 101 while(x) 102 { 103 if(sz[son[x][0]]+1==b) return x; 104 if(sz[son[x][0]]+1>b) x=son[x][0]; 105 else b-=sz[son[x][0]]+1,x=son[x][1]; 106 pushdown(x); 107 } 108 while(1);return -1e9; 109 } 110 111 inline void INSERT(int sl) 112 { 113 int x=find(gb),y=find(gb-1); 114 splay(y,0); splay(x,y); 115 build(son[x][0],1,sl,x); 116 pushup(x); pushup(y); 117 } 118 119 inline void DELETE(int k) 120 { 121 int x=find(gb+k),y=find(gb-1); 122 splay(y,0); splay(x,y); 123 fa[son[x][0]]=0; son[x][0]=0; 124 pushup(x); pushup(y); 125 } 126 127 inline void REVERSE(int k) 128 { 129 int x=find(gb+k),y=find(gb-1); 130 splay(y,0); splay(x,y); 131 rev[son[x][0]]^=1; 132 } 133 134 inline void go() 135 { 136 init(); gb=2; 137 scanf("%d",&m); 138 for(int i=1,a;i<=m;i++) 139 { 140 scanf("%s",str); 141 if(str[0]=='M') 142 { 143 scanf("%d",&a); 144 gb=a+2; 145 } 146 else if(str[0]=='I') 147 { 148 scanf("%d",&a);getchar(); 149 gets(str+1); 150 INSERT(a); 151 } 152 else if(str[0]=='D') 153 { 154 scanf("%d",&a); 155 DELETE(a); 156 } 157 else if(str[0]=='R') 158 { 159 scanf("%d",&a); 160 REVERSE(a); 161 } 162 else if(str[0]=='G') 163 { 164 printf("%c\n",val[find(gb)]); 165 } 166 else if(str[0]=='P') 167 { 168 gb--; 169 } 170 else if(str[0]=='N') 171 { 172 gb++; 173 } 174 } 175 } 176 177 int main() 178 { 179 go(); 180 return 0; 181 }
POJ 3468:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <algorithm> 5 #include <cstring> 6 7 #define N 200000 8 #define INF 1LL<<50 9 10 using namespace std; 11 //带区间更新的splay模板 12 __int64 sum[N],val[N],dt[N]; 13 int bh[N],son[N][2],fa[N],sz[N]; 14 int n,m,root,cnt; 15 16 inline void pushup(__int64 x) 17 { 18 sum[x]=sum[son[x][0]]+sum[son[x][1]]+val[x]; 19 sz[x]=sz[son[x][0]]+sz[son[x][1]]+1; 20 } 21 22 inline void renew(int x,__int64 d) 23 { 24 if(!x) return; 25 sum[x]+=sz[x]*d; 26 val[x]+=d; 27 dt[x]+=d; 28 } 29 30 inline void pushdown(int x) 31 { 32 if(!x||dt[x]==0) return; 33 renew(son[x][0],dt[x]); renew(son[x][1],dt[x]); 34 dt[x]=0; 35 } 36 37 inline void link(int x,int y,int c) 38 { 39 fa[x]=y; son[y][c]=x; 40 } 41 42 inline void rotate(int x,int c) 43 { 44 int y=fa[x]; 45 pushdown(y); 46 pushdown(x); 47 link(x,fa[y],son[fa[y]][1]==y); 48 link(son[x][!c],y,c); 49 link(y,x,!c); 50 pushup(y); 51 } 52 53 inline void splay(int x,int g) 54 { 55 while(fa[x]!=g) 56 { 57 int y=fa[x]; 58 int cy=(son[fa[y]][1]==y),cx=(son[y][1]==x); 59 if(fa[y]==g) rotate(x,cx); 60 else 61 { 62 if(cx==cy) rotate(y,cy); 63 else rotate(x,cx); 64 rotate(x,cy); 65 } 66 } 67 pushup(x); 68 if(!g) root=x; 69 } 70 71 inline void newnode(int y,int &x,__int64 sp,int b) 72 { 73 x=++cnt; 74 fa[x]=y; val[x]=sp; bh[x]=b; sum[x]=val[x]; dt[x]=0; sz[x]=1; 75 son[x][0]=son[x][1]=0; 76 } 77 78 inline void init() 79 { 80 cnt=0; 81 newnode(0,root,-INF,0); 82 newnode(root,son[root][1],INF,n+1); 83 sz[root]=2; 84 } 85 86 inline void insert(__int64 sp,int b) 87 { 88 int x=root; 89 while(son[x][b>bh[x]]) x=son[x][b>bh[x]]; 90 newnode(x,son[x][b>bh[x]],sp,b); 91 splay(cnt,0); 92 } 93 94 inline int getpos(int b) 95 { 96 int x=root; 97 while(x) 98 { 99 if(bh[x]==b) return x; 100 x=son[x][b>bh[x]]; 101 } 102 } 103 104 inline void increase(int l,int r,__int64 sp) 105 { 106 int f1=getpos(l-1); 107 int f2=getpos(r+1); 108 splay(f1,0); splay(f2,f1); 109 renew(son[f2][0],sp); 110 } 111 112 inline void getsum(int l,int r) 113 { 114 int f1=getpos(l-1); 115 int f2=getpos(r+1); 116 splay(f1,0); splay(f2,f1); 117 printf("%I64d\n",sum[son[f2][0]]); 118 } 119 120 inline void go() 121 { 122 init(); 123 for(int i=1,a;i<=n;i++) 124 { 125 scanf("%I64d",&a); 126 insert(a,i); 127 } 128 char str[10];__int64 c; 129 for(int i=1,a,b,c;i<=m;i++) 130 { 131 scanf("%s",str); 132 if(str[0]=='C') 133 { 134 scanf("%d%d%I64d",&a,&b,&c); 135 increase(a,b,c); 136 } 137 else 138 { 139 scanf("%d%d",&a,&b); 140 getsum(a,b); 141 } 142 } 143 } 144 145 int main() 146 { 147 while(scanf("%d%d",&n,&m)!=EOF) go(); 148 return 0; 149 }
BZOJ 1500:集Splay的大多数功能于一身~
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cstdio> 5 #include <algorithm> 6 7 #define N 500000 8 #define INF 1e8 9 #define BUG system("pause") 10 11 using namespace std; 12 13 int sz[N],sum[N],val[N],mx[N],lmx[N],rmx[N],fa[N],son[N][2]; 14 bool rev[N],lz[N]; 15 int q[N],h,ss[N]; 16 int n,m,posi,tot,num,root,cnt; 17 18 inline void prt() 19 { 20 for(int i=1;i<=cnt;i++) printf("%d %d %d %d %d %d\n",i,son[i][0],son[i][1],sz[i],val[i],rev[i]); 21 } 22 23 inline void pushup(int x) 24 { 25 sz[x]=sz[son[x][0]]+sz[son[x][1]]+1; 26 sum[x]=sum[son[x][0]]+sum[son[x][1]]+val[x]; 27 lmx[x]=max(lmx[son[x][0]],max(sum[son[x][0]]+val[x],sum[son[x][0]]+val[x]+lmx[son[x][1]])); 28 rmx[x]=max(rmx[son[x][1]],max(sum[son[x][1]]+val[x],sum[son[x][1]]+val[x]+rmx[son[x][0]])); 29 mx[x]=max(max(mx[son[x][0]],mx[son[x][1]]),val[x]+max(0,lmx[son[x][1]])+max(0,rmx[son[x][0]])); 30 } 31 32 inline void reverse(int x) 33 { 34 if(!x) return; 35 rev[x]^=1; 36 swap(son[x][0],son[x][1]); 37 swap(lmx[x],rmx[x]); 38 } 39 40 inline void renew(int x,int sp) 41 { 42 if(!x) return; 43 val[x]=sp; lz[x]=true; 44 sum[x]=sz[x]*sp; 45 lmx[x]=rmx[x]=mx[x]=max(sp,sum[x]); 46 } 47 48 inline void pushdown(int x) 49 { 50 if(!x) return; 51 if(rev[x]) 52 { 53 rev[x]=false; 54 reverse(son[x][0]); 55 reverse(son[x][1]); 56 } 57 if(lz[x]) 58 { 59 lz[x]=false; 60 renew(son[x][0],val[x]); 61 renew(son[x][1],val[x]); 62 } 63 } 64 65 inline void link(int x,int y,int c) 66 { 67 fa[x]=y; son[y][c]=x; 68 } 69 70 inline void rotate(int x,int c) 71 { 72 int y=fa[x]; 73 link(x,fa[y],son[fa[y]][1]==y); 74 link(son[x][!c],y,c); 75 link(y,x,!c); 76 pushup(y); 77 } 78 79 inline void splay(int x,int g) 80 { 81 while(fa[x]!=g) 82 { 83 int y=fa[x]; 84 pushdown(fa[y]); pushdown(y); pushdown(x); 85 int cy=(son[fa[y]][1]==y),cx=(son[y][1]==x); 86 if(fa[y]==g) rotate(x,cx); 87 else 88 { 89 if(cx==cy) rotate(y,cy); 90 else rotate(x,cx); 91 rotate(x,cy); 92 } 93 } 94 pushup(x); 95 if(!g) root=x; 96 } 97 98 inline int getnum() 99 { 100 if(h==0) return ++cnt; 101 return q[h--]; 102 } 103 104 inline void newnode(int y,int &x,int sp) 105 { 106 x=getnum(); 107 fa[x]=y; sz[x]=1; val[x]=sum[x]=mx[x]=lmx[x]=rmx[x]=sp; rev[x]=lz[x]=0; 108 son[x][0]=son[x][1]=0; 109 } 110 111 inline void init() 112 { 113 cnt=0; 114 newnode(0,root,-INF); 115 newnode(root,son[root][1],INF); 116 sz[root]=2; 117 } 118 119 inline void build(int &x,int l,int r,int g) 120 { 121 if(l>r) return; 122 int mid=(l+r)>>1; 123 newnode(g,x,ss[mid]); 124 build(son[x][0],l,mid-1,x); 125 build(son[x][1],mid+1,r,x); 126 pushup(x); 127 } 128 129 inline int find(int b) 130 { 131 int x=root; 132 pushdown(x); 133 while(x) 134 { 135 if(sz[son[x][0]]==b) return x; 136 else if(sz[son[x][0]]>b) x=son[x][0]; 137 else b-=sz[son[x][0]]+1,x=son[x][1]; 138 pushdown(x); 139 } 140 } 141 142 inline void recycle(int x) 143 { 144 if(!x) return; 145 q[++h]=x; 146 recycle(son[x][0]); 147 recycle(son[x][1]); 148 } 149 150 inline void INSERT() 151 { 152 int x=find(posi),y=find(posi+1); 153 splay(x,0); splay(y,x); 154 build(son[y][0],1,tot,y); 155 pushup(y); pushup(x); 156 } 157 158 inline void DELETE() 159 { 160 int x=find(posi-1),y=find(posi+tot); 161 splay(x,0); splay(y,x); 162 recycle(son[y][0]); 163 fa[son[y][0]]=0; 164 son[y][0]=0; 165 pushup(y); pushup(x); 166 } 167 168 inline void SAME() 169 { 170 int x=find(posi-1),y=find(posi+tot); 171 splay(x,0); splay(y,x); 172 renew(son[y][0],num); 173 pushup(y); pushup(x); 174 } 175 176 inline void REVERSE() 177 { 178 int x=find(posi-1),y=find(posi+tot); 179 splay(x,0); splay(y,x); 180 reverse(son[y][0]); 181 pushup(y); pushup(x); 182 } 183 184 inline void MAXSUM() 185 { 186 splay(1,0); splay(2,1); 187 printf("%d\n",mx[son[2][0]]); 188 } 189 190 inline void GETSUM() 191 { 192 int x=find(posi-1),y=find(posi+tot); 193 splay(x,0); splay(y,x); 194 printf("%d\n",sum[son[y][0]]); 195 } 196 197 inline void go() 198 { 199 init(); 200 mx[0]=lmx[0]=rmx[0]=val[0]=-INF; 201 scanf("%d%d",&n,&m); 202 for(int i=1;i<=n;i++) scanf("%d",&ss[i]); 203 build(son[son[root][1]][0],1,n,son[root][1]); 204 pushup(son[root][1]); 205 pushup(root); 206 char str[20]; 207 while(m--) 208 { 209 scanf("%s",str); 210 if(str[0]=='I') 211 { 212 scanf("%d%d",&posi,&tot); 213 for(int i=1;i<=tot;i++) scanf("%d",&ss[i]); 214 INSERT(); 215 } 216 else if(str[0]=='D') 217 { 218 scanf("%d%d",&posi,&tot); 219 DELETE(); 220 } 221 else if(str[0]=='M') 222 { 223 if(str[6]=='A') 224 { 225 scanf("%d%d%d",&posi,&tot,&num); 226 SAME(); 227 } 228 else 229 { 230 MAXSUM(); 231 } 232 } 233 else if(str[0]=='R') 234 { 235 scanf("%d%d",&posi,&tot); 236 REVERSE(); 237 } 238 else 239 { 240 scanf("%d%d",&posi,&tot); 241 GETSUM(); 242 } 243 } 244 } 245 246 int main() 247 { 248 go(); 249 return 0; 250 }
复习专用。
数据结构裸题,没有什么思维含量,主要是模拟不要写错!!!!
没有人能阻止我前进的步伐,除了我自己!