Splay 专辑

Splay写的真是抑郁,各种被坑。。。

被题坑,被自己坑。

一直在调程序。。。

Splay模板:

View Code
  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:

View Code
  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:

View Code
  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:

View Code
  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:

View Code
  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:

View Code
  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:

View Code
  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:

View Code
  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的大多数功能于一身~

View Code
  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 } 

 

复习专用。

数据结构裸题,没有什么思维含量,主要是模拟不要写错!!!!

 

你可能感兴趣的:(play)