LCT——BZOJ2816/Luogu2173 [ZJOI2012]网络
2017-05-19 16:17
183 查看
题面:Luogu2173
由于BZOJ管理员没放题面(甚至说数据有误,事实证明数据没错可以正常AC)
所以BZOJ链接不放了
我们先考虑单个颜色的情况,题面就变成了单点修改,链上求最大值
原本想的是树剖,但是某些边要改颜色,所以边是可以修改的。。。
那么就可以LCT搞一搞维护一下东西
然后改颜色的问题……搞c棵LCT不就好了,每棵LCT表示只有i一种颜色的LCT边
然后修改颜色的时候在原来颜色的LCT上cut一下,在修改后颜色的LCT上Link一下就好了
关于修改的时候的乱七八糟的处理,我们多加几个特判嘛。。。
由于BZOJ管理员没放题面(甚至说数据有误,事实证明数据没错可以正常AC)
所以BZOJ链接不放了
我们先考虑单个颜色的情况,题面就变成了单点修改,链上求最大值
原本想的是树剖,但是某些边要改颜色,所以边是可以修改的。。。
那么就可以LCT搞一搞维护一下东西
然后改颜色的问题……搞c棵LCT不就好了,每棵LCT表示只有i一种颜色的LCT边
然后修改颜色的时候在原来颜色的LCT上cut一下,在修改后颜色的LCT上Link一下就好了
关于修改的时候的乱七八糟的处理,我们多加几个特判嘛。。。
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<iostream> #include<cstdlib> #include<string> #include<ctime> #include<queue> #include<map> #define mp make_pair using namespace std; map<pair<int,int>,int>jzq; int n,m,c,k,zh[100001],v[100001]; struct LCT{ int t[100001][2],fa[100001],la[100001],s[100001],cnt[100001]; inline void pushup(int x){s[x]=max(v[x],max(s[t[x][0]],s[t[x][1]]));} inline void pushdown(int x){ if(la[x]){ swap(t[x][1],t[x][0]); la[t[x][1]]^=1;la[t[x][0]]^=1; } la[x]=0; } inline bool rt(int x){ return t[fa[x]][0]!=x&&t[fa[x]][1]!=x; } inline void turn(int x){ int y=fa[x],z=fa[y],l=(x!=t[fa[x]][0]),r=(y!=t[fa[y]][0]); int p=t[x][l^1]; if(!rt(y))t[z][r]=x; fa[p]=y;fa[x]=z;t[x][l^1]=y;fa[y]=x;t[y][l]=p; pushup(y);pushup(x); } inline void splay(int x){ int i=x,y,z;for(;!rt(i);i=fa[i])zh[++zh[0]]=i; zh[++zh[0]]=i;while(zh[0])pushdown(zh[zh[0]--]); while(!rt(x)){ y=fa[x];z=fa[y]; if(!rt(y)){ if((t[y][0]==x)^(t[z][0]==y))turn(x); else turn(y); } turn(x); } } inline void access(int x){ int p=0; while(x){ splay(x);t[x][1]=p; p=x;pushup(x);x=fa[x]; } } inline void chrt(int x){ access(x);splay(x);la[x]^=1; } inline void link(int x,int y){ chrt(x);fa[x]=y; } inline void cut(int x,int y){ chrt(x);access(y);splay(y); t[y][0]=fa[x]=0;pushup(y); } inline int askrt(int x){ access(x);splay(x);int p=x;pushdown(x); while(t[p][0])p=t[p][0],pushdown(p); return p; } }T[11]; int main() { scanf("%d%d%d%d",&n,&m,&c,&k); for(int i=1;i<=n;i++){ scanf("%d",&v[i]); for(int j=1;j<=c;j++)T[j].s[i]=v[i]; } for(int i=1;i<=m;i++){ int x,y,z;scanf("%d%d%d",&x,&y,&z);z++; T[z].link(x,y);T[z].cnt[x]++;T[z].cnt[y]++; jzq[mp(x,y)]=jzq[mp(y,x)]=z; } for(int i=1;i<=k;i++){ int p,x,y,z;scanf("%d%d%d",&p,&x,&y); if(p==0){ v[x]=y; for(int j=1;j<=c;j++)T[j].access(x),T[j].splay(x),T[j].pushdown(x); } if(p==1){ scanf("%d",&z);z++; if(!jzq[mp(x,y)]){puts("No such edge.");cont da4d inue;} if(jzq[mp(x,y)]==z){puts("Success.");continue;}//坑!这样也算Success if(T[z].cnt[x]>=2||T[z].cnt[y]>=2){puts("Error 1.");continue;} if(T[z].askrt(x)==T[z].askrt(y)){puts("Error 2.");continue;} int jsg=jzq[mp(x,y)]; puts("Success.");T[jsg].cnt[x]--;T[jsg].cnt[y]--;T[z].cnt[x]++;T[z].cnt[y]++; T[jsg].cut(x,y);T[z].link(x,y); jzq[mp(x,y)]=jzq[mp(y,x)]=z; } if(p==2){ scanf("%d",&z);swap(x,y);swap(y,z);z++; if(T[z].askrt(x)!=T[z].askrt(y)){puts("-1");continue;} T[z].chrt(x);T[z].access(y);T[z].splay(y);printf("%d\n",T[z].s[y]); } } return 0; }
相关文章推荐
- 【bzoj2816】[ZJOI2012]网络 LCT
- [bzoj2816][ZJOI2012]网络(LCT,splay)
- 【bzoj2816】【ZJOI2012】【网络】【lct】
- [BZOJ2816][ZJOI2012]网络(lct+map)
- BZOJ.2816.[ZJOI2012]网络(LCT)
- ZJOI2012 网络——LCT相关题目
- [BZOJ2816][ZJOI2012]网络(LCT)
- [ZJOI2012][bzoj 2816] 网络 network [LCT]
- [BZOJ2816][ZJOI2012]网络(LCT)
- bzoj2816 [ZJOI2012]网络(lct)
- ZJOI2012网络--LCT强化练习
- BZOJ2816:[ZJOI2012]网络——题解
- AC日记——[ZJOI2012]网络 bzoj 2816
- [bzoj2816][ZJOI2012]网络
- BZOJ 2816 [ZJOI2012]网络 Link Cut Tree
- [BZOJ2816][ZJOI2012]网络-Link Cut Tree
- 【BZOJ2816】【ZJOI2012】网络(Link-Cut Tree)
- bzoj2816.。。。。zjoi2012网络
- [ZJOI2012]网络 解题报告
- bzoj 2816: [ZJOI2012]网络(splay)