bzoj 4415: [Shoi2013]发牌

2333,一开始想了一下,嗯,就是支持一个点删除,然后翻转的话,就把(删除点之后)总区间,点的左区间和右区间都翻转一下就好了。

然后开开心心的码完,sb的调了半天。然后TLE

呵呵呵

然后弱势围观题解,题解就写了30行多。

原来这种东西可以用权值线段树来维护还有哪些点可行,而且每一次的销牌可以看做是向右移动多少位置(当然要取模的)

诶,太弱了。代码能力什么的,根本没有233

  1 /*#include <cstdio>
  2 #include <iostream>
  3 #include <cstring>
  4 #include <algorithm>
  5 #define inf 0x3f3f3f3f
  6 #define LL long long
  7 #define eps 1e-8
  8 #define N 100005
  9 #define ls c[x][0]
 10 #define rs c[x][1]
 11 using namespace std;
 12 inline int ra()
 13 {
 14     int x=0,f=1; char ch=getchar();
 15     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
 16     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
 17     return x*f;
 18 }
 19 
 20 const int maxn=700010;
 21 
 22 int root,n;
 23 
 24 struct Splay_Tree
 25 {
 26     int fa[maxn],c[maxn][2],size[maxn];
 27     bool rev[maxn];
 28     
 29     void update(int x) {size[x]=size[ls]+size[rs]+1;}
 30     void pushdown(int x)
 31     {
 32         if (rev[x]) {rev[x]^=1; rev[ls]^=1; rev[rs]^=1; swap(ls,rs);}
 33     }
 34     bool which(int x) {return c[fa[x]][1]==x;}
 35     void build(int l, int r, int FA)
 36     {
 37         if (l>r) return;
 38         if (l==r) {
 39             size[l]=1; fa[l]=FA; c[FA][l>=FA]=l;
 40             return;
 41         }
 42         int mid=l+r>>1;
 43         fa[mid]=FA; c[FA][mid>=FA]=mid;
 44         build(l,mid-1,mid); build(mid+1,r,mid);
 45         update(mid);
 46     }
 47     void rotate(int x, int &aim)
 48     {
 49         pushdown(x); 
 50         int y=fa[x],z=fa[y]; bool nx=which(x),ny=which(y);
 51     //    printf("%d %d",y,z);system("pause");
 52         if (y==aim) aim=x; else c[z][ny]=x; fa[x]=z;
 53         fa[c[x][!nx]]=y; c[y][nx]=c[x][!nx];
 54         fa[y]=x; c[x][!nx]=y; update(y); update(x);
 55     }
 56     void Splay(int x, int &aim)
 57     {
 58         while (x!=aim)
 59         {
 60             int y=fa[x],z=fa[y];
 61             if (y!=aim)
 62             {
 63                 if (which(x)==which(y)) rotate(y,aim);
 64                     else rotate(x,aim);
 65             }
 66             rotate(x,aim);
 67         }
 68     }
 69     int find(int x, int rank)
 70     {
 71         pushdown(x);
 72     //    cout<<x;system("pause");
 73         if (!x) return 0;
 74         if (rank==size[ls]+1) return x;
 75         else if (rank<=size[ls]) return find(ls,rank);
 76         else return find(rs,rank-size[ls]-1);
 77     }
 78     void rever(int l, int r)
 79     {
 80         int x=find(root,l),y=find(root,r+2);
 81         Splay(x,root); Splay(y,c[x][1]);
 82         rev[c[y][0]]^=1;
 83     }
 84     void del(int pos)
 85     {
 86         int x=find(root,pos),y=find(root,pos+2);
 87     //    printf("%d %d\n",x,y);system("pause");
 88         Splay(x,root); Splay(y,c[x][1]);
 89         fa[c[y][0]]=0; c[y][0]=0;
 90         update(y); update(x);
 91     }
 92 }T;
 93 int main(int argc, char const *argv[])
 94 {
 95     n=ra();
 96     T.build(1,n+2,0); root=n+3>>1;
 97     for (int i=n; i>=1; i--)
 98     {
 99         int x=ra()%i;
100         printf("%d\n",T.find(root,x+2)-1);
101         T.del(x+1);
102         T.rever(1,x); T.rever(x+1,i-1); T.rever(1,i-1);
103     //    cout<<"!!!!"<<endl;
104     }
105     return 0;
106 }*/
107 
108 /*
109 #include<bits/stdc++.h>
110 #define N 1000005
111 #define LL long long
112 #define inf 0x3f3f3f3f
113 #define ls tr[x][0]
114 #define rs tr[x][1]
115 using namespace std;
116  int ra()
117 {
118     int x=0,f=1; char ch=getchar();
119     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
120     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
121     return x*f;
122 }
123 int buf[30];
124  void write(int x)
125 {
126     if (x<0) putchar('-'),x=-x;
127     buf[0]=0;
128     while (x) buf[++buf[0]]=x%10,x/=10;
129     if (!buf[0]) buf[0]=1,buf[1]=0;
130     while (buf[0]) putchar('0'+buf[buf[0]--]);
131     puts("");
132 }
133 struct SPLAY{
134     bool rev[N];
135     int fa[N],tr[N][2],root,v[N],size[N],w[N],cnt;
136     
137      bool which(int x){return tr[fa[x]][1]==x;}
138      void update(int x){size[x]=size[ls]+size[rs]+1;}
139     void build(int l, int r, int FA)
140     {
141         if (l>r) return;
142         if (l==r) {
143             size[l]=1; fa[l]=FA; tr[FA][l>=FA]=l;
144             return;
145         }
146         int mid=l+r>>1;
147         fa[mid]=FA; tr[FA][mid>=FA]=mid;
148         build(l,mid-1,mid); build(mid+1,r,mid);
149         update(mid);
150     }
151      void rotate(int x)
152     {
153         int y=fa[x],z=fa[y]; bool nx=which(x),ny=which(y);
154         tr[y][nx]=tr[x][!nx]; fa[tr[x][!nx]]=y;
155         fa[y]=x; tr[x][!nx]=y; fa[x]=z;
156         if (z) tr[z][ny]=x; update(y); update(x);
157     }
158      void splay(int x, int aim)
159     {
160         while (fa[x]!=aim)
161         {
162             int y=fa[x],z=fa[y];
163             if (z==aim) rotate(x);
164             else if (which(x)==which(y)) rotate(y),rotate(x);
165             else rotate(x),rotate(x);
166         }
167         if (!aim) root=x; update(x);
168     }
169     void insert(int val)
170     {
171         int x=root;
172         for (;;)
173         {
174             if (val<v[x]) 
175                 if (!ls) {ls=val,fa[ls]=x,size[ls]=1; splay(ls,0); break;} else x=ls;
176             else if (!rs) {rs=val,fa[rs]=x,size[rs]=1; splay(rs,0); break;} else x=rs;
177         }
178     }
179      void pushdown(int x)
180     {
181         if (rev[x])
182         {
183             swap(ls,rs);
184             rev[ls]^=1; rev[rs]^=1;
185             rev[x]=0;
186         }
187     }
188      int find(int x, int rank)
189     {
190         pushdown(x);
191         if (!x) return 0;
192         if (size[ls]+1==rank) return x;
193         else if (size[ls]>=rank) return find(ls,rank);
194         else return find(rs,rank-size[ls]-1);
195     }
196      void rever(int l, int r)
197     {
198         if (l>r) return;
199         int x=find(root,l);int y=find(root,r+2);
200         splay(x,0); splay(y,x);
201         rev[tr[y][0]]^=1;
202     }
203      void del(int pos)
204     {
205         int x=find(root,pos),y=find(root,pos+2);
206     //    printf("%d %d\n",x,y);system("pause");
207     //    cout<<tr[y][0];
208         splay(x,0); splay(y,x);
209         fa[tr[y][0]]=0; tr[y][0]=0;
210         update(y); update(x);
211     }
212 }T;
213 int n,m;
214 int main()
215 {
216     freopen("bzoj4415_data.in","r",stdin);
217     freopen("bzoj4415_data.out","w",stdout);
218     n=ra();
219   //  for (int i=1; i<=n+2; i++) T.insert(i);
220       T.build(1,n+2,0); T.root=n+3>>1;// for (int i=1; i<=n+2; i++) printf("%d %d %d\n",T.fa[i],T.tr[i][0],T.tr[i][1]);
221     for (int i=n; i>=1; i--)
222     {
223         int x=ra()%i; //cout<<x;
224         write(T.find(T.root,x+2)-1); T.del(x+1); 
225  //   for (int j=1; j<=i+1; j++)
226   //      printf("%d ",T.find(T.root,j)-1); cout<<endl;
227         T.rever(1,x); T.rever(x+1,i-1); T.rever(1,i-1); 
228         
229    // for (int j=1; j<=i+1; j++)
230    //     printf("%d ",T.find(T.root,j)-1);
231     }
232 }*/
233 
234 
235 
236 
237 
238 
239 
240 #include<bits/stdc++.h>
241 #define N 1000005
242 #define LL long long
243 #define inf 0x3f3f3f3f
244 #define ls tr[x][0]
245 #define rs tr[x][1]
246 using namespace std;
247  int ra()
248 {
249     int x=0,f=1; char ch=getchar();
250     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
251     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
252     return x*f;
253 }
254 struct seg{int l,r,sum,msg;}t[N<<2],tree[N<<2];
255 int n;
256 void build(int k, int l, int r)
257 {
258     t[k].l=l; t[k].r=r;
259     if (l==r) {t[k].sum=1; return;}
260     int mid=l+r>>1;
261     build(k<<1,l,mid); build(k<<1|1,mid+1,r); 
262     t[k].sum=r-l+1;
263 }
264 int query(int k, int x)
265 {
266     int l=t[k].l,r=t[k].r;
267     t[k].sum--;
268     return l==r?l:(t[k<<1].sum>=x?query(k<<1,x):query(k<<1|1,x-t[k<<1].sum));
269 }
270 int main()
271 {
272     n=ra(); build(1,1,n); int now=0;
273     while (n--)
274     {
275         int x=ra(); (now+=x)%=(n+1);
276         printf("%d\n",query(1,now+1));
277     }
278 }

 

posted @ 2017-04-01 22:00  ws_ccd  阅读(235)  评论(0编辑  收藏  举报