标签:
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cstdio> 6 #include<string> 7 #include<cmath> 8 #include<ctime> 9 #include<queue> 10 #include<stack> 11 #include<map> 12 #include<set> 13 #define rre(i,r,l) for(int i=(r);i>=(l);i--) 14 #define re(i,l,r) for(int i=(l);i<=(r);i++) 15 #define Clear(a,b) memset(a,b,sizeof(a)) 16 #define inout(x) printf("%d",(x)) 17 #define douin(x) scanf("%lf",&x) 18 #define strin(x) scanf("%s",(x)) 19 #define LLin(x) scanf("%lld",&x) 20 #define op operator 21 #define CSC main 22 typedef unsigned long long ULL; 23 typedef const int cint; 24 typedef long long LL; 25 using namespace std; 26 void inin(int &ret) 27 { 28 ret=0;int f=0;char ch=getchar(); 29 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=1;ch=getchar();} 30 while(ch>=‘0‘&&ch<=‘9‘)ret*=10,ret+=ch-‘0‘,ch=getchar(); 31 ret=f?-ret:ret; 32 } 33 namespace iceset 34 { 35 int fa[100010],n; 36 void init(){re(i,1,n)fa[i]=i;} 37 int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);} 38 void merge(int l,int r){fa[find(l)]=fa[find(r)];} 39 } 40 namespace heap 41 { 42 int w[100010],ch[100010][2]; 43 int root,ed; 44 int merge(int l,int r) 45 { 46 if(!l||!r)return l+r; 47 if(w[l]>w[r])swap(l,r); 48 ch[l][1]=merge(ch[l][1],r); 49 swap(ch[l][0],ch[l][1]); 50 return l; 51 } 52 void pop(){root=merge(ch[root][0],ch[root][1]);} 53 void push(int x){w[++ed]=x,ch[ed][0]=ch[ed][1]=0;root=merge(root,ed);} 54 int top(){return w[root];} 55 bool empty(){return !root;} 56 int size(){return ed;} 57 } 58 namespace bit 59 { 60 int c[100010],limit; 61 int lowbit(int x){return x&-x;} 62 void add(int pos,int x) 63 { 64 while(pos<=limit)c[pos]+=x,pos+=lowbit(pos); 65 } 66 int query(int pos) 67 { 68 int ret=0; 69 while(pos)ret+=c[pos],pos-=lowbit(pos); 70 return ret; 71 } 72 } 73 namespace bit2//bzoj1452 74 { 75 int n,m; 76 int lowbit(int x){return x&-x;} 77 struct BIT 78 { 79 int c[333][333]; 80 void add(int a,int b,int x) 81 { 82 int i=a; 83 while(i<=n) 84 { 85 int j=b; 86 while(j<=m)c[i][j]+=x,j+=lowbit(j); 87 i+=lowbit(i); 88 } 89 } 90 int query(int a,int b) 91 { 92 int ret=0,i=a; 93 while(i) 94 { 95 int j=b; 96 while(j)ret+=c[i][j],j-=lowbit(j); 97 i-=lowbit(i); 98 } 99 return ret; 100 } 101 }col[111]; 102 int a[333][333]; 103 void solve() 104 { 105 inin(n),inin(m); 106 re(i,1,n)re(j,1,m) 107 inin(a[i][j]),col[a[i][j]].add(i,j,1); 108 int q,x;;inin(q); 109 while(q--) 110 { 111 int opt,x1,x2,y1,y2; 112 inin(opt); 113 if(opt==1) 114 { 115 inin(x1),inin(y1),inin(x); 116 col[a[x1][y1]].add(x1,y1,-1);a[x1][y1]=x; 117 col[a[x1][y1]].add(x1,y1,1); 118 } 119 else 120 { 121 inin(x1),inin(x2),inin(y1),inin(y2),inin(x); 122 printf("%d\n",col[x].query(x2,y2)+col[x].query(x1-1,y1-1)-col[x].query(x1-1,y2)-col[x].query(x2,y1-1)); 123 } 124 } 125 } 126 } 127 namespace treap//bzoj3224 128 { 129 int ch[100010][2],w[100010],c[100010],s[100010],r[100010],ed,root; 130 void maintain(int x){if(x)s[x]=c[x]+s[ch[x][0]]+s[ch[x][1]];} 131 void rotate(int &k,int d) 132 { 133 int p=ch[k][d^1]; 134 ch[k][d^1]=ch[p][d]; 135 ch[p][d]=k; 136 maintain(k); 137 maintain(p);k=p; 138 } 139 void add(int &k,int x) 140 { 141 if(!k) 142 { 143 k=++ed;w[k]=x,s[k]=c[k]=1,ch[k][0]=ch[k][1]=0,r[k]=rand(); 144 return ; 145 } 146 s[k]++; 147 if(w[k]==x){c[k]++;return ;} 148 int d=x>w[k]; 149 add(ch[k][d],x); 150 if(r[ch[k][d]]<r[k])rotate(k,d^1); 151 } 152 bool del(int &k,int x) 153 { 154 if(!k)return 0; 155 if(w[k]==x) 156 { 157 if(c[k]>1){s[k]--;c[k]--;return 1;} 158 if(!ch[k][0]){k=ch[k][1];return 1;} 159 if(!ch[k][1]){k=ch[k][0];return 1;} 160 if(r[ch[k][0]]<r[ch[k][1]])rotate(k,1); 161 else rotate(k,0); 162 return del(k,x); 163 } 164 int d=x>w[k]; 165 if(del(ch[k][d],x)){s[k]--;return 1;} 166 return 0; 167 } 168 int findrank(int x) 169 { 170 int k=root,ret=0; 171 while(k) 172 { 173 int pp=s[ch[k][0]]; 174 if(x==w[k])return ret+pp; 175 else if(x<w[k])k=ch[k][0]; 176 else ret+=(pp+c[k]),k=ch[k][1]; 177 } 178 return ret; 179 } 180 int findwei(int x) 181 { 182 int k=root; 183 while(k) 184 { 185 int pp=s[ch[k][0]]; 186 if(x<=pp)k=ch[k][0]; 187 else if(x>pp+c[k])x-=pp+c[k],k=ch[k][1]; 188 else return w[k]; 189 } 190 return 0; 191 } 192 int findqian(int x) 193 { 194 int k=root,ret=0; 195 while(k) 196 { 197 if(w[k]<x)ret=w[k],k=ch[k][1]; 198 else k=ch[k][0]; 199 } 200 return ret; 201 } 202 int findhou(int x) 203 { 204 int k=root,ret=0; 205 while(k) 206 { 207 if(w[k]>x)ret=w[k],k=ch[k][0]; 208 else k=ch[k][1]; 209 } 210 return ret; 211 } 212 int n; 213 void solve() 214 { 215 inin(n); 216 re(i,1,n) 217 { 218 int opt,x; 219 inin(opt),inin(x); 220 if(opt==1)add(root,x); 221 else if(opt==2)del(root,x); 222 else if(opt==3)printf("%d\n",findrank(x)+1); 223 else if(opt==4)printf("%d\n",findwei(x)); 224 else if(opt==5)printf("%d\n",findqian(x)); 225 else if(opt==6)printf("%d\n",findhou(x)); 226 } 227 } 228 } 229 namespace splay//bzoj3223 230 { 231 int ch[100010][2],fa[100010],w[100010],s[100010],rev[100010],ed,root; 232 void maintain(int x){if(x)s[x]=1+s[ch[x][0]]+s[ch[x][1]];} 233 void rotate(int x) 234 { 235 int y=fa[x],z=fa[y]; 236 if(z)ch[z][ch[z][1]==y]=x; 237 fa[x]=z,fa[y]=x; 238 int d=ch[y][1]==x; 239 if(ch[x][d^1])fa[ch[x][d^1]]=y; 240 ch[y][d]=ch[x][d^1]; 241 ch[x][d^1]=y; 242 maintain(y); 243 maintain(x); 244 } 245 void down(int x) 246 { 247 if(rev[x]) 248 { 249 swap(ch[x][0],ch[x][1]); 250 rev[ch[x][0]]^=1; 251 rev[ch[x][1]]^=1; 252 rev[x]=0; 253 } 254 } 255 int sta[100010],top; 256 void splay(int x,int f) 257 { 258 int xx=x;top=0; 259 while(xx!=f)sta[++top]=xx,xx=fa[xx]; 260 while(top)down(sta[top--]); 261 while(fa[x]!=f) 262 { 263 int y=fa[x],z=fa[y]; 264 if(z!=f) 265 if((ch[y][1]==x)^(ch[z][1]==y))rotate(x); 266 else rotate(y);else ; 267 rotate(x); 268 } 269 maintain(x); 270 if(!f)root=x; 271 } 272 int a[100010],n,m; 273 int build(int l,int r) 274 { 275 if(l>r)return 0; 276 if(l==r) 277 { 278 ed++; 279 w[ed]=a[l],s[ed]=1; 280 return ed; 281 } 282 int mid=(l+r)>>1,ret=++ed; 283 ch[ret][0]=build(l,mid-1); 284 ch[ret][1]=build(mid+1,r); 285 fa[ch[ret][0]]=fa[ch[ret][1]]=ret; 286 w[ret]=a[mid]; 287 maintain(ret); 288 return ret; 289 } 290 void print(int x) 291 { 292 if(!x)return ; 293 if(w[x]==0){print(ch[x][1]);return ;} 294 if(w[x]==n+1){print(ch[x][0]);return ;} 295 down(x); 296 print(ch[x][0]); 297 printf("%d ",w[x]); 298 print(ch[x][1]); 299 } 300 int findwei(int x) 301 { 302 int k=root; 303 while(k) 304 { 305 down(k); 306 int pp=s[ch[k][0]]; 307 if(x<=pp)k=ch[k][0]; 308 else if(x==pp+1)return k; 309 else x-=pp+1,k=ch[k][1]; 310 } 311 return 0; 312 } 313 void solve() 314 { 315 inin(n);inin(m); 316 re(i,0,n+1)a[i]=i; 317 root=build(0,n+1); 318 re(i,1,m) 319 { 320 int l,r; 321 inin(l),inin(r); 322 l=findwei(l),r=findwei(r+2); 323 splay(l,0),splay(r,l); 324 rev[ch[r][0]]^=1; 325 } 326 print(root); 327 } 328 } 329 namespace segmenttree//codevs1082 330 { 331 LL w[800080],add[800080],a[200020]; 332 int l[800080],r[800080]; 333 void build(int k,int ll,int rr) 334 { 335 l[k]=ll,r[k]=rr; 336 if(ll==rr){w[k]=a[ll];return ;} 337 int mid=(ll+rr)>>1,p1=k<<1,p2=p1|1; 338 build(p1,ll,mid); 339 build(p2,mid+1,rr); 340 w[k]=w[p1]+w[p2]; 341 } 342 void addtag(int k,LL x) 343 { 344 w[k]+=x*(r[k]-l[k]+1); 345 add[k]+=x; 346 } 347 void down(int k) 348 { 349 if(!add[k])return ; 350 addtag(k<<1,add[k]); 351 addtag(k<<1|1,add[k]); 352 add[k]=0; 353 } 354 void change(int k,int ll,int rr,LL x) 355 { 356 if(l[k]>=ll&&r[k]<=rr){addtag(k,x);return ;} 357 down(k); 358 int mid=(l[k]+r[k])>>1,p1=k<<1,p2=p1|1; 359 if(rr<=mid)change(p1,ll,rr,x); 360 else if(ll>mid)change(p2,ll,rr,x); 361 else change(p1,ll,rr,x),change(p2,ll,rr,x); 362 w[k]=w[p1]+w[p2]; 363 } 364 LL query(int k,int ll,int rr) 365 { 366 if(l[k]>=ll&&r[k]<=rr)return w[k]; 367 down(k); 368 int mid=(r[k]+l[k])>>1,p1=k<<1,p2=p1|1; 369 if(rr<=mid)return query(p1,ll,rr); 370 if(ll>mid)return query(p2,ll,rr); 371 return query(p1,ll,rr)+query(p2,ll,rr); 372 } 373 int n,m; 374 void solve() 375 { 376 inin(n); 377 re(i,1,n)LLin(a[i]); 378 build(1,1,n); 379 inin(m); 380 re(i,1,m) 381 { 382 int opt,q,ww; 383 LL e; 384 inin(opt); 385 if(opt==1) 386 { 387 inin(q),inin(ww),LLin(e); 388 change(1,q,ww,e); 389 } 390 else 391 { 392 inin(q),inin(ww); 393 cout<<query(1,q,ww);cout<<"\n"; 394 } 395 } 396 } 397 } 398 namespace pst//bzoj3524 399 { 400 int root[500050],l[10000010],r[10000010],sum[10000010]; 401 int n,m,ed; 402 void update(int ll,int rr,int x,int &y,int xx) 403 { 404 y=++ed,sum[y]=sum[x]+1; 405 if(ll==rr)return ; 406 l[y]=l[x],r[y]=r[x]; 407 int mid=(ll+rr)>>1; 408 if(xx<=mid)update(ll,mid,l[x],l[y],xx); 409 else update(mid+1,rr,r[x],r[y],xx); 410 } 411 int query(int L,int R) 412 { 413 int ll=1,rr=n,mid,x=root[L-1],y=root[R],temp=(R-L+1)>>1; 414 while(ll<rr) 415 { 416 if(sum[y]-sum[x]<=temp)return 0;mid=(ll+rr)>>1; 417 if(sum[l[y]]-sum[l[x]]>temp)rr=mid,x=l[x],y=l[y]; 418 else if(sum[r[y]]-sum[r[x]]>temp)ll=mid+1,x=r[x],y=r[y]; 419 else return 0; 420 } 421 return ll; 422 } 423 void solve() 424 { 425 inin(n),inin(m); 426 re(i,1,n) 427 { 428 int x;inin(x); 429 update(1,n,root[i-1],root[i],x); 430 } 431 re(i,1,m) 432 { 433 int ll,rr;inin(ll),inin(rr); 434 printf("%d\n",query(ll,rr)); 435 } 436 } 437 } 438 namespace lct//bzoj2049 439 { 440 int ch[10010][2],fa[10010],rev[10010]; 441 bool isroot(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;} 442 void rotate(int x) 443 { 444 int y=fa[x],z=fa[y]; 445 if(!isroot(y))ch[z][ch[z][1]==y]=x; 446 fa[x]=z,fa[y]=x; 447 int d=ch[y][1]==x; 448 fa[ch[x][d^1]]=y; 449 ch[y][d]=ch[x][d^1]; 450 ch[x][d^1]=y; 451 } 452 void down(int x) 453 { 454 if(rev[x]) 455 { 456 swap(ch[x][0],ch[x][1]); 457 rev[ch[x][0]]^=1; 458 rev[ch[x][1]]^=1; 459 rev[x]=0; 460 } 461 } 462 int sta[100010],top; 463 void splay(int x) 464 { 465 top=0;int xx=x;sta[++top]=xx; 466 while(!isroot(xx))sta[++top]=fa[xx],xx=fa[xx]; 467 while(top)down(sta[top--]); 468 while(!isroot(x)) 469 { 470 int y=fa[x],z=fa[y]; 471 if(!isroot(y)) 472 if((ch[y][1]==x)^(ch[z][1]==y))rotate(x); 473 else rotate(y);else ; 474 rotate(x); 475 } 476 } 477 void access(int x) 478 { 479 int temp=0; 480 while(x) 481 { 482 splay(x); 483 ch[x][1]=temp; 484 temp=x,x=fa[x]; 485 } 486 } 487 void reverse(int x) 488 { 489 access(x),splay(x),rev[x]^=1; 490 } 491 void link(int x,int y) 492 { 493 reverse(x),fa[x]=y,splay(x); 494 } 495 void cut(int x,int y) 496 { 497 reverse(x),access(y),splay(y),fa[x]=ch[y][0]=0; 498 } 499 int find(int x) 500 { 501 access(x),splay(x); 502 while(ch[x][0])x=ch[x][0]; 503 return x; 504 } 505 int n,m; 506 void solve() 507 { 508 inin(n),inin(m);char s[20]; 509 re(i,1,m) 510 { 511 strin(s);int q,ww;inin(q),inin(ww); 512 if(s[0]==‘Q‘) 513 { 514 if(find(q)==find(ww))cout<<"Yes\n"; 515 else cout<<"No\n"; 516 } 517 else if(s[0]==‘C‘) 518 { 519 link(q,ww); 520 } 521 else cut(q,ww); 522 } 523 } 524 } 525 int main() 526 { 527 return 0; 528 }
标签:
原文地址:http://www.cnblogs.com/HugeGun/p/5256590.html