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 }