记录编号 223842 评测结果 AAAAAAAAAAAAAAW
题目名称 [WC 2006]水管局长数据加强版 最终得分 93
用户昵称 Gravatar/k 是否通过 未通过
代码语言 C++ 运行时间 3.343 s
提交时间 2016-02-13 21:32:16 内存使用 52.67 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<map>
#include<algorithm>
using namespace std;
map<int,int>ma;
bool bbb[1000010];
int ff[100010];
int sta[1000010],tsta,pt;
inline int gf(int a)
{
	if(a==ff[a])
		return ff[a];
	ff[a]=gf(ff[a]);
	return ff[a];
}
inline void gj(int a,int b)
{
	a=gf(a);
	b=gf(b);
	ff[a]=b;
}
int f[1100010];
int z[1100010];
int w[1100010];
int Z[1100010],Y[1100010],st[1100010];
int dy[1100010];
int r[1100010];
bool b[1100010];
struct u
{
	int a;
	int b;
	int z;
}c[1000010];
inline bool gg(const u aa,const u bb)
{
	return aa.z<bb.z;
}
struct uu
{
	int k;
	int a;
	int b;
}qs[100010];
inline int in()
{
	char ch = getchar();
	for ( ; ch > '9' || ch < '0'; ch = getchar());
	int tmp = 0;
	for ( ; '0' <= ch && ch <= '9'; ch = getchar())
		tmp = tmp * 10 + int(ch) - 48;
	return tmp;
}
int n,m,Q;
int ns;
inline bool grt(int a)
{
	return (f[a]==0||(Z[f[a]]!=a&&Y[f[a]]!=a));
}
inline void Pushdown(int a)
{
	if(b[a])
	{
		b[a]=0;
		b[Z[a]]^=1;
		b[Y[a]]^=1;
		swap(Z[a],Y[a]);
	}
}
inline void Updata(int a)
{
	z[a]=w[a];
	r[a]=a;
	if(Z[a])
	{
		if(z[a]<z[Z[a]])
		{
			r[a]=r[Z[a]];
			z[a]=z[Z[a]];
		}
	}
	if(Y[a])
	{
		if(z[a]<z[Y[a]])
		{
			r[a]=r[Y[a]];
			z[a]=z[Y[a]];
		}
	}
}
inline void gy(int x)
{
	int y=f[x];
	int z=f[y];
	if(Z[z]==y)
	    Z[z]=x;
	else
	    if(Y[z]==y)
	        Y[z]=x;
	 f[x]=z;
	 f[Y[x]]=y;
	 Z[y]=Y[x];
	 f[y]=x;
	 Y[x]=y;
}
inline void gz(int x)
{
	int xx=x;
	int y=f[x];
	int z=f[y];
	//if(xx==796)
	//    printf("%d %d\n",f[796],z);
	if(Z[z]==y)
	    Z[z]=x;
	else
	    if(Y[z]==y)
	        Y[z]=x;
	 f[x]=z;
	 f[Z[x]]=y;
	 Y[y]=Z[x];
	 f[y]=x;
	 Z[x]=y;
}
inline void Splay(int x)
{
	//printf("%d ",f[796]);
/*	if(f[796]==796)
	{
		printf("GAME OVER");
	    while(1);
	}*/
	//printf("wrong %d\n",x);
	int xx=x;
	int y=x,t=1;
	st[t]=y;
	//printf("A");
	while(!grt(y))
	{
	/*if(y==f[y]&&y==796)
	{
	printf("A%d %d ",y,f[y]);
	    //while(1);
	}*/
	//if(y==f[y])
	   // printf("%d ",y);
		y=f[y];
		st[++t]=y;
	}
	//printf("B");
	for(int i=t;i>=1;i--)
	    Pushdown(st[i]);
	for(int i=1;i<=t;i++)
	    Updata(st[i]);
	while(!grt(x))
	{
		y=f[x];
		if(Y[y]==x)
		    gz(x);
		else
		    gy(x);
		Updata(y);
		Updata(x);
	}
}
inline void Access(int x)
{
	int t=0;
	while(x)
	{
		Splay(x);
		Y[x]=t;
		Updata(x);
		t=x;
		x=f[x];
	}
}
inline void Mroot(int a)
{
	Access(a);
	Splay(a);
	b[a]^=1;
}
inline void Link(int father,int son)
{
	Mroot(son);
	f[son]=father;
}
inline void Cut(int father,int son)
{
	//if(son==796||father==796)
	//    printf("GREAT");
	//if(father==son)
	//    printf("WWW\n");
	Mroot(son);
	Access(father);
	Splay(father);
	f[son]=0;
	Z[father]=0;
}
inline int gw(int aa,int bb)
{
	Mroot(aa);
	//printf("H%d ");
	Access(bb);
	Splay(aa);
	//if(aa>n||bb>n)
	//    printf("E");
	pt=r[Y[aa]];
	w[0]=0;
	/*if(pt<=n)
	{
	    printf("WRONG%d ",Y[aa]);
	    while(1);
	}*/
	return z[Y[aa]];
}
inline void ggx(int a)
{
	int i=ma[100000*qs[a].a+qs[a].b];
	gw(c[i].a,c[i].b);
	//printf("R%d\n",o);
	if(c[i].z>=w[pt])
	    return;
	int d=dy[pt];
	//if(d==0)
	//    printf("WA");
	Cut(c[d].a,pt);
	Cut(pt,c[d].b);
	++ns;
	dy[ns]=i;
	w[ns]=c[i].z;
	Link(c[i].a,ns);
	Link(ns,c[i].b);
}
int main()
{
	freopen("tube_strong.in","r",stdin);
	freopen("tube_strong.out","w",stdout);
	n=in(),m=in(),Q=in();
	ns=n;
	for(int i=1;i<=m;i++)
	{
	    c[i].a=in(),c[i].b=in(),c[i].z=in();
	    if(c[i].a>c[i].b)
	        swap(c[i].a,c[i].b);
	}
	sort(c+1,c+1+m,gg);
	for(int i=1;i<=m;i++)
	{
		ma[c[i].a*100000+c[i].b]=i;
	}
	for(int i=1;i<=n;i++)
	    ff[i]=i;
	for(int i=1;i<=Q;i++)
	{
		qs[i].k=in(),qs[i].a=in(),qs[i].b=in();
		if(qs[i].a>qs[i].b)
		    swap(qs[i].a,qs[i].b);
		if(qs[i].k==2)
		    bbb[ma[100000*qs[i].a+qs[i].b]]=1;
	}
	for(int i=1;i<=m;i++)
	if(!bbb[i])
	    if(gf(c[i].a)!=gf(c[i].b))
	    {
			gj(c[i].a,c[i].b);
			++ns;
			dy[ns]=i;
			w[ns]=c[i].z;
			Link(c[i].a,ns);
			Link(ns,c[i].b);
	    }
	    //for(int i=1;i<=10;i++)
	    //    printf("%d ",gw(1,4));
	//    printf("%d ",f[796]);
	for(int i=Q;i>=1;i--)
	{
		if(qs[i].k==1)
		{
			sta[++tsta]=gw(qs[i].a,qs[i].b);
		}
		else
		{
	//printf("%d\n",Q);
		    ggx(i);
		}
		/*if(f[796]==796)
		{
			printf("%d ",qs[i].k);
			while(1);
		}*/
	}
	while(tsta)
	    printf("%d\n",sta[tsta--]);
	    //while(1);
	getchar();
	getchar();
}