码迷,mamicode.com
首页 > 其他好文 > 详细

一些LCT裸题

时间:2016-03-03 23:04:35      阅读:531      评论:0      收藏:0      [点我收藏+]

标签:

  又来回炉lct了= =

[bzoj3514]: Codechef MARCH14 GERALD07加强版

    模版题。常见姿势,把边也当成点。

技术分享
  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 using namespace std;
  5 const int maxn=200233<<1;
  6 const int inf=1000023333;
  7 struct zs{
  8     int u,v;
  9 }e[200233];
 10 int ch[maxn][2],fa[maxn],mnpos[maxn],st[maxn],top;
 11 bool rev[maxn],ty;
 12 int lc[200233*30],rc[200233*30],sz[200233*30],rt[200233],ntr[200233];
 13 int i,j,k,n,m,x,y,l,r,K,tot,ans,a;
 14 
 15 int ra;char rx;
 16 inline int read(){
 17     ra=0,rx=getchar();
 18     while(rx<0||rx>9)rx=getchar();
 19     while(rx>=0&&rx<=9)ra*=10,ra+=rx-48,rx=getchar();return ra;
 20 }
 21 inline int min(int a,int b){return a<b?a:b;}
 22 inline bool isrt(int x){
 23     return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;
 24 }
 25 inline void pushdown(int x){
 26     if(!rev[x])return;
 27     
 28     int l=ch[x][0],r=ch[x][1];
 29     if(l)rev[l]^=1;if(r)rev[r]^=1;
 30     swap(ch[x][0],ch[x][1]),rev[x]=0;
 31 }
 32 inline void upd(int x){
 33     mnpos[x]=min(x<=m?x:inf,min(mnpos[ch[x][0]],mnpos[ch[x][1]]));
 34 }
 35 inline void rotate(int x){
 36     int f=fa[x],gfa=fa[f],l=ch[f][1]==x,r=l^1;
 37     if(!isrt(f))ch[gfa][ch[gfa][1]==f]=x;
 38     fa[ch[f][l]=ch[x][r]]=f,fa[fa[ch[x][r]=f]=x]=gfa;
 39     mnpos[x]=mnpos[f],upd(f);
 40 }
 41 inline void splay(int x){
 42     int f=x,gfa;
 43     for(st[top=1]=f;!isrt(f);st[++top]=(f=fa[f]));
 44     while(top)pushdown(st[top--]);
 45     while(!isrt(x)){
 46         f=fa[x],gfa=fa[f];
 47         if(!isrt(f))
 48             rotate(((ch[f][1]==x)^(ch[gfa][1]==f))?x:f);
 49         rotate(x);
 50     }
 51 }
 52 inline void access(int x){
 53     for(int rc=0;x;rc=x,x=fa[x])
 54         splay(x),ch[x][1]=rc,upd(x);
 55 }
 56 inline void makert(int x){
 57     access(x),splay(x),rev[x]^=1;
 58 }
 59 inline void link(int x,int y){
 60     makert(x),fa[x]=y;
 61 }
 62 inline void cut(int x,int y){
 63     makert(x),access(y),splay(y),fa[x]=ch[y][0]=0;
 64 }
 65 inline int getfa(int x){
 66     for(access(x),splay(x);ch[x][0];x=ch[x][0]);
 67     return x;
 68 }
 69 
 70 inline void insert(int pre,int &x,int a,int b,int v){
 71     sz[x=++tot]=sz[pre]+1;
 72     if(a==b)return;
 73     int mid=(a+b)>>1;
 74     if(v<=mid)rc[x]=rc[pre],insert(lc[pre],lc[x],a,mid,v);
 75     else lc[x]=lc[pre],insert(rc[pre],rc[x],mid+1,b,v);
 76 }
 77 inline int query(int pre,int x,int a,int b,int d){
 78     if(b<=d||!x)return sz[x]-sz[pre];
 79     int mid=(a+b)>>1;
 80     if(d<=mid)return query(lc[pre],lc[x],a,mid,d);
 81     else return sz[lc[x]]-sz[lc[pre]]+query(rc[pre],rc[x],mid+1,b,d);
 82 }
 83 int main(){
 84     n=read(),m=read(),K=read(),ty=read();
 85     mnpos[0]=inf;
 86     for(i=1;i<=m;i++)mnpos[i]=i;for(i=m+1;i<=n+m;i++)mnpos[i]=inf;
 87     
 88     for(i=1;i<=m;i++){
 89         e[i].u=x=read(),e[i].v=y=read();
 90         x+=m,y+=m;
 91         if(x!=y){
 92             if(getfa(x)==getfa(y)){
 93                 makert(x),access(y),splay(y),ntr[i]=a=mnpos[y];
 94                 cut(e[a].u+m,a),cut(a,e[a].v+m);
 95             }
 96             link(x,i),link(i,y);
 97         }else ntr[i]=i;
 98         insert(rt[i-1],rt[i],0,m,ntr[i]);
 99 //        printf("  %d  %d\n",i,ntr[i]);
100     }
101     while(K--){
102         l=read()^(ty?ans:0),r=read()^(ty?ans:0);
103         ans=n-query(rt[l-1],rt[r],0,m,l-1);
104         printf("%d\n",ans);
105     }
106     return 0;
107 }
View Code

 

[hdu4010]: Query on The Trees

  大概是有史以来调LCT调得最惨的一次了。。因为删边那里判断是否合法时少了个条件。。调了整个晚上>_<。。。。

  被模版题教做人了QAQ。。

技术分享
  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 using namespace std;
  5 const int maxn=300233;
  6 struct zs{
  7     int too,pre;
  8 }e[maxn<<1];int tot,last[maxn],dl[maxn];
  9 int ch[maxn][2],fa[maxn],mxv[maxn],v[maxn],add[maxn],st[maxn],top;
 10 bool rev[maxn];
 11 int i,j,k,n,m,x,y,w;
 12 
 13 int ra;char rx;
 14 inline int read(){
 15     rx=getchar(),ra=0;
 16     while(rx<0||rx>9)rx=getchar();
 17     while(rx>=0&&rx<=9)ra*=10,ra+=rx-48,rx=getchar();return ra;
 18 }
 19 
 20 inline void insert(int a,int b){
 21     e[++tot].too=b,e[tot].pre=last[a],last[a]=tot;
 22     e[++tot].too=a,e[tot].pre=last[b],last[b]=tot;
 23 }
 24 
 25 inline int max(int a,int b){return a>b?a:b;}
 26 inline bool isrt(int x){
 27     return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;
 28 }
 29 inline void pushdown(int x){
 30     int l=ch[x][0],r=ch[x][1];
 31     if(rev[x]){
 32         swap(ch[x][0],ch[x][1]),
 33         rev[l]^=1,rev[r]^=1,rev[x]=0;
 34     }
 35     if(add[x]){
 36         if(l)add[l]+=add[x],mxv[l]+=add[x],v[l]+=add[x];
 37         if(r)add[r]+=add[x],mxv[r]+=add[x],v[r]+=add[x];
 38         add[x]=0;
 39     }
 40 }
 41 inline void upd(int x){
 42     mxv[x]=max(mxv[ch[x][0]],mxv[ch[x][1]]);
 43     if(mxv[x]<v[x])mxv[x]=v[x];
 44 }
 45 inline void rotate(int x){
 46     int f=fa[x],gfa=fa[f],l=ch[f][1]==x,r=l^1;
 47     if(!isrt(f))ch[gfa][ch[gfa][1]==f]=x;
 48     fa[ch[f][l]=ch[x][r]]=f,fa[fa[ch[x][r]=f]=x]=gfa,
 49     upd(f);
 50 }
 51 inline void splay(int x){
 52     int f=x,gfa;
 53     for(st[top=1]=f;!isrt(f);)st[++top]=(f=fa[f]);
 54     while(top)pushdown(st[top--]);
 55     while(!isrt(x)){
 56         f=fa[x],gfa=fa[f];
 57         if(!isrt(f))
 58             rotate(((ch[f][1]==x)^(ch[gfa][1]==f))?x:f);
 59         rotate(x);
 60     }
 61     upd(x);
 62 }
 63 inline void access(int x){
 64     for(int rc=0;x;rc=x,x=fa[x])
 65         splay(x),ch[x][1]=rc,upd(x);
 66 }
 67 inline void makert(int x){
 68     access(x),splay(x),rev[x]^=1;
 69 }
 70 inline void link(int x,int y){
 71     makert(x),fa[x]=y;
 72 }
 73 inline void cut(int x,int y){
 74     makert(x),access(y),splay(y),fa[ch[y][0]]=0,ch[y][0]=0,upd(y);
 75 }
 76 inline int getfa(int x){
 77     for(access(x),splay(x);ch[x][0];x=ch[x][0]);
 78     return x;
 79 }
 80 
 81 int main(){
 82     mxv[0]=-200023333;bool first=1;
 83     while(scanf("%d",&n)==1){
 84         if(!first)
 85             for(i=0;i<=n;i++)rev[i]=add[i]=ch[i][0]=ch[i][1]=last[i]=0;
 86         else first=0;
 87         tot=0;
 88         
 89         for(i=1;i<n;i++)
 90             x=read(),y=read(),insert(x,y);
 91         for(i=1;i<=n;i++)v[i]=mxv[i]=read();
 92         int l=0,r=1,now;dl[1]=1;fa[1]=0;
 93         
 94         while(l<r){
 95             now=dl[++l];
 96             for(i=last[now];i;i=e[i].pre)if(e[i].too!=fa[now])
 97                 fa[dl[++r]=e[i].too]=now;
 98         }
 99         
100         m=read();char id;
101         while(m--){
102             for(id=getchar();id<0||id>9;id=getchar());
103             if(id==3)w=read();
104             x=read(),y=read();bool sm=(getfa(x)==getfa(y));
105             if(id==1)
106                 if(sm)puts("-1");
107                 else link(x,y);
108             if(id==2)
109                 if(!sm||x==y)puts("-1");
110                 else cut(x,y);
111             if(id==3)
112                 if(!sm)puts("-1");
113                 else makert(x),access(y),splay(y),add[y]+=w,mxv[y]+=w,v[y]+=w;
114             if(id==4)
115                 if(!sm)puts("-1");
116                 else makert(x),access(y),splay(y),printf("%d\n",mxv[y]);
117         }
118         puts("");
119     }
120     return 0;
121 }
View Code

 

一些LCT裸题

标签:

原文地址:http://www.cnblogs.com/czllgzmzl/p/5240270.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!