终于调出了真正意义上的第一道LCT
所以说不要在意块状链表shi的弹飞绵羊
所以说不要在意并查集shi的洞穴勘测
所以说又要开始贴模板的没羞没臊的生活了
因为写access的时候只是看了定义然后自己yy的没有参考神犇的代码所以写得超级丑Orz,然后很多地方估计让R爷看了也是要被婊翻的。不过跑得好像还不错显然是R爷快啊Orz
我好像还不会写指针Orz
#include<cstdio> #include<algorithm> using namespace std; struct tree{ int l,r,xo,fa,s; bool re; }t[300005]; int n,m,flag,x,y,fa[300005]; inline int read(){ int ret=0; char c=getchar(); while((c>'9')||(c<'0'))c=getchar(); while((c>='0')&&(c<='9'))ret=(ret<<1)+(ret<<3)+c-'0',c=getchar(); return ret; } void pushdown(int root){ if(t[root].re){ swap(t[root].l,t[root].r); if(t[root].l)t[t[root].l].re^=true; if(t[root].r)t[t[root].r].re^=true; t[root].re=false; } } void pushup(int root){t[root].xo=t[t[root].l].xo^t[t[root].r].xo^t[root].s;} void rorate(int k,int i){ int tmp=t[k].fa; if(fa[tmp]){fa[k]=fa[tmp];fa[tmp]=0;} t[k].fa=t[tmp].fa; if(t[t[tmp].fa].l==tmp)t[t[tmp].fa].l=k; else t[t[tmp].fa].r=k; t[tmp].fa=k; if(i==0){ if(t[k].l>0)t[t[k].l].fa=tmp; t[tmp].r=t[k].l;t[k].l=tmp; }else{ if(t[k].r>0)t[t[k].r].fa=tmp; t[tmp].l=t[k].r;t[k].r=tmp; } pushup(tmp);pushup(k); } void splay(int k){ while(t[k].fa){ int tmp=t[k].fa; if(t[tmp].fa==0){ pushdown(tmp);pushdown(k); if(t[tmp].r==k)rorate(k,0); else rorate(k,1); } else{ int Tmp=t[tmp].fa; pushdown(Tmp);pushdown(tmp);pushdown(k); if(t[Tmp].l==tmp){ if(t[tmp].l==k)rorate(tmp,1); else rorate(k,0); rorate(k,1); }else{ if(t[tmp].r==k)rorate(tmp,0); else rorate(k,1); rorate(k,0); } } } } void access(int p){ splay(p); pushdown(p); if(t[p].r){ fa[t[p].r]=p; t[t[p].r].fa=0;t[p].r=0; pushup(p); } while(fa[p]){ splay(fa[p]); pushdown(fa[p]); t[p].fa=fa[p]; if(t[fa[p]].r){ fa[t[fa[p]].r]=fa[p]; t[t[fa[p]].r].fa=0; } t[fa[p]].r=p; fa[p]=0; pushup(t[p].fa); splay(p); } } void change_root(int x){access(x);t[x].re^=1;} void link(int x,int y){ change_root(x); fa[x]=y; } void cut(int x,int y){change_root(x);access(y);if(t[y].l==x)t[y].l=t[x].fa=0,pushup(y);} inline int find(int p){for(pushdown(p),access(p);t[p].l;p=t[p].l);return p;} int main(){ n=read();m=read(); for(int i=1;i<=n;i++)t[i].s=t[i].xo=read(); for(int i=1;i<=m;i++){ flag=read();x=read();y=read(); if(flag==0){ change_root(x); access(y); printf("%d\n",t[y].xo); } if(flag==1)if(find(x)!=find(y))link(x,y); if(flag==2)if(find(x)==find(y))cut(x,y); if(flag==3){ t[x].s=y; while(x)pushup(x),x=t[x].fa; } } }
--------------------------------------------------------------------------------------------------
#include<cstdio> #include<algorithm> using namespace std; struct tree{ int l,r,fa,max,w; bool re; }t[150005]; struct edge{ int u,v,a,b; }e[100005]; int ans,n,m,cnt; inline int read(){ int ret=0; char c=getchar(); while((c>'9')||(c<'0'))c=getchar(); while((c>='0')&&(c<='9'))ret=(ret<<1)+(ret<<3)+c-'0',c=getchar(); return ret; } inline bool cmp(edge e1,edge e2){return e1.a<e2.a;} void pushdown(int k){ if(t[k].re){ swap(t[k].l,t[k].r); if(t[k].l)t[t[k].l].re^=1; if(t[k].r)t[t[k].r].re^=1; t[k].re=false; } } void pushup(int k){ t[k].max=k; if(t[k].l)if(t[t[t[k].l].max].w>t[t[k].max].w)t[k].max=t[t[k].l].max; if(t[k].r)if(t[t[t[k].r].max].w>t[t[k].max].w)t[k].max=t[t[k].r].max; } void rorate(int k,int i){ int tmp=t[k].fa; t[k].fa=t[tmp].fa; if(t[t[tmp].fa].l==tmp)t[t[tmp].fa].l=k; if(t[t[tmp].fa].r==tmp)t[t[tmp].fa].r=k; t[tmp].fa=k; if(i==0){ if(t[k].l)t[t[k].l].fa=tmp; t[tmp].r=t[k].l;t[k].l=tmp; } else{ if(t[k].r)t[t[k].r].fa=tmp; t[tmp].l=t[k].r;t[k].r=tmp; } pushup(tmp);pushup(k); } void splay(int k){ while((t[t[k].fa].l==k)||(t[t[k].fa].r==k)){ int tmp=t[k].fa; if((t[t[tmp].fa].l!=tmp)&&(t[t[tmp].fa].r!=tmp)){ pushdown(tmp);pushdown(k); if(t[tmp].l==k)rorate(k,1); else rorate(k,0); }else{ int Tmp=t[tmp].fa; pushdown(Tmp);pushdown(tmp);pushdown(k); if(t[Tmp].l==tmp){ if(t[tmp].l==k)rorate(tmp,1); else rorate(k,0); rorate(k,1); }else{ if(t[tmp].r==k)rorate(tmp,0); else rorate(k,1); rorate(k,0); } } } } void access(int k){ splay(k);pushdown(k);t[k].r=0;pushup(k); while(t[k].fa){ splay(t[k].fa); pushdown(t[k].fa); t[t[k].fa].r=k; pushup(t[k].fa); splay(k); } } void change_root(int x){access(x);t[x].re^=1;} void cut(int x,int y){change_root(x);access(y);t[x].r=0;t[y].fa=0;pushup(x);} void link(int x,int y){change_root(x);t[x].fa=y;} inline int find(int k){access(k);while(t[k].l)k=t[k].l;return k;} inline int qmax(int x,int y){change_root(x);access(y);return t[y].max;} void Link(int x,int y,int w){ cnt++; t[cnt].w=w; link(x,cnt); link(y,cnt); } void work(int x,int y){ int k=qmax(x,y);change_root(k); access(x);splay(k);t[t[k].r].fa=0;t[k].r=0; access(y);splay(k);t[t[k].r].fa=0;t[k].r=0; } int main(){ n=read();m=read(); for(int i=1;i<=m;i++)e[i].u=read(),e[i].v=read(),e[i].a=read(),e[i].b=read(); sort(e+1,e+1+m,cmp); ans=2000000; cnt=n; for(int i=1;i<=m;i++){ if(find(e[i].u)==find(e[i].v)){ if(t[qmax(e[i].u,e[i].v)].w>e[i].b){ work(e[i].u,e[i].v); Link(e[i].u,e[i].v,e[i].b); } }else Link(e[i].u,e[i].v,e[i].b); if(find(1)==find(n))ans=min(e[i].a+t[qmax(1,n)].w,ans); } if(ans==2000000)printf("-1"); else printf("%d",ans); }
2016年3月12日 14:49
这里有诋毁您的言论,还有python交易:zhaoleyi.github.io
2016年3月12日 14:53
@对面的clc: 以上是正解
2016年3月12日 15:53
using namespace std可以加速程序运行吗?——我们机房的Z大牛说的
2016年3月14日 08:07
@对面的clc: 你不写using namespace std;就会CE我刚转C++经常干这个事