luogu在线ide可过下载的数据(时间空间ok答案正确),提交MLE
查看原帖
luogu在线ide可过下载的数据(时间空间ok答案正确),提交MLE
174399
fzwfzwfzw楼主2020/5/12 16:39

RT

luogu在线ide可过下载的数据(时间空间ok答案正确)

提交MLE

(经测试,并不是空间开爆的原因)

求解答

(我校oj可过)

#include<bits/stdc++.h>
using namespace std;
int read()
{
	char c;
	int w=1;
	while((c=getchar())>'9'||c<'0')if(c=='-')w=-1;
	int ans=c-'0';
	while((c=getchar())>='0'&&c<='9')ans=(ans<<1)+(ans<<3)+c-'0';
	return ans*w;
}
int n,m,q;
int cstw;
int ans[300005];
struct node
{
	int a,b,c;
}e[2000005];
int fa[300005];
int findf(int x)
{
	return fa[x]==x?x:fa[x]=findf(fa[x]);
}
map <pair<int,int>,int> mm;
int w[300005][4];
bool cmp(node x,node y)
{
	return x.c<y.c;
}
int size[300005];
int maxx[300005][2];
int c[300005][2];
int val[300005];
int uu[300005];
int vv[300005];
int rev[300005];
int f[300005];
void ph(int x)
{
	maxx[x][0]=val[x];
	maxx[x][1]=x;
	if(maxx[c[x][0]][0]>maxx[x][0])
	{
		maxx[x][0]=maxx[c[x][0]][0];
		maxx[x][1]=maxx[c[x][0]][1];
	}
	if(maxx[c[x][1]][0]>maxx[x][0])
	{
		maxx[x][0]=maxx[c[x][1]][0];
		maxx[x][1]=maxx[c[x][1]][1];
	}
}
bool nroot(int x)
{
	return (c[f[x]][0]==x)||(c[f[x]][1]==x);
}
void rotate(int x)
{
	int fa=f[x],gr=f[fa],s=c[fa][1]==x;
	c[fa][s]=c[x][!s];f[c[x][!s]]=fa;
	f[x]=gr;if(nroot(fa))c[gr][c[gr][1]==fa]=x;
	f[c[x][!s]=fa]=x;ph(fa);ph(x);
}
int rv(int x)
{
	if(x)swap(c[x][0],c[x][1]),rev[x]^=1;
}
void pd(int x)
{
	if(rev[x])rv(c[x][0]),rv(c[x][1]),rev[x]=0;
}
void pds(int x)
{
	if(nroot(x))pds(f[x]);
	pd(x);
}
void print(int x)
{
	if(!x)return;
	pd(x);
	cout<<"QWQ  "<<x<<" ";
	print(c[x][0]);
	print(c[x][1]);
}
void splay(int x)
{
//	cout<<"splay"<<" "<<x<<endl;
	pds(x);
	while(nroot(x))
	{
		int y=f[x];
		int z=f[y];
		if(nroot(y))
		if((c[z][1]==y)==(c[y][1]==x))rotate(y);
		else rotate(x);
		rotate(x);
	}
//			cout<<endl;
//			print(x);
}
void access(int x)
{
	for(int y=0;x;x=f[y=x])
	{
//		cout<<"OOO"<<x<<" "<<endl;
		splay(x);
		c[x][1]=y;
		ph(x);
	}
}
void evert(int x)
{
	access(x);
	splay(x);
	rv(x);
//	print(x);
}
void link(int x,int y)
{
	evert(x);
	f[x]=y;
}
void cut(int x,int y)
{
	evert(x);
	access(y);
	splay(x);
//	cout<<"********************"<<endl;
//	cout<<x<<" "<<y<<" "<<c[x][1]<<' '<<f[y]<<endl;
//	cout<<"********************"<<endl;
	f[y]=c[x][1]=0;
}
int main(){
//	system("fc P4172_2.out b.out");
//	freopen("P4172_2.in","r",stdin);
//	freopen("b.out","w",stdout);
	n=read();
	for(int i=1;i<=n;i++)
	{
		fa[i]=i;
	}
	m=read();
	q=read();
	int sum=0;
	for(int i=1;i<=m;i++)
	{
		e[i].a=read();
		e[i].b=read();
		if(e[i].a>e[i].b)swap(e[i].a,e[i].b);
		e[i].c=read();
		mm[make_pair(e[i].a,e[i].b)]=i;
	}
	for(int i=1;i<=q;i++)
	{
		w[i][0]=read();
		w[i][1]=read();
		w[i][2]=read();
		if(w[i][1]>w[i][2])swap(w[i][1],w[i][2]);
		if(w[i][0]==2)
		{
			int www=mm[make_pair(w[i][1],w[i][2])];
			w[i][3]=e[www].c;
			e[www].a=0;
			e[www].b=0;
			e[www].c=0;
		}
	}
	sort(e+1,e+m+1,cmp);
	int cnts=n;
	for(int i=1;i<=m;i++)
	{
		int a,b,c;
		a=e[i].a;
		b=e[i].b;
		c=e[i].c;
//		cout<<c<<endl;
		if(e[i].a==e[i].b&&e[i].a==0)
		{
			continue;
		}
		a=findf(a);
		b=findf(b);
		if(a!=b)
		{
			sum++;
			fa[b]=a;
			++cnts;
//			cout<<e[i].a<<" "<<e[i].b<<" "<<e[i].c<<endl;
			uu[cnts]=e[i].a;
			vv[cnts]=e[i].b;
//			cout<<"-------------------"<<endl;
//			cout<<cnts<<endl;
//			cout<<uu[cnts]<<" "<<vv[cnts]<<endl;
//			cout<<"-------------------"<<endl;
			val[cnts]=e[i].c;
			link(cnts,e[i].a);
			link(e[i].b,cnts);
		}
		if(sum==n-1)break;
	}
	for(int i=q;i>=1;i--)
	{
//		cout<<w[i][0]<<" "<<w[i][1]<<" "<<w[i][2]<<" "<<w[i][3]<<endl;
		if(w[i][0]==2)
		{
			int a,b,c;
			a=w[i][1];
			b=w[i][2];
			c=w[i][3];
			evert(a);
			access(b);
			splay(b);
			if(maxx[b][0]>c)
			{
//				cout<<"qweqweoiwqueowq"<<endl;
//				cout<<maxx[b][0]<<endl;
//cout<<maxx[b][1]<<uu[maxx[b][1]]<<endl;
				int oo=maxx[b][1];
				
				cut(oo,uu[oo]);
				cut(oo,vv[oo]);
				++cnts;
				uu[cnts]=a;
				vv[cnts]=b;
				val[cnts]=c;
//				cout<<"-------------------"<<endl;
//				cout<<cnts<<endl;
//				cout<<uu[cnts]<<" "<<vv[cnts]<<endl;
//				cout<<"-------------------"<<endl;
//				cout<<a<<" "<<b<<" "<<c<<endl;
				link(a,cnts);
				link(b,cnts);
				evert(a);
				access(b);
				splay(b);
//				cout<<maxx[b][0]<<endl;
			}
		}
		if(w[i][0]==1)
		{
			int a,b;
			a=w[i][1];
			b=w[i][2];
			evert(a);
			access(b);
			splay(b);
//			cout<<c[b][0]<<endl;
//			cout<<c[b][1]<<endl;
			ans[++cstw]=maxx[b][0];
//			cout<<b<<" "<<maxx[b][0]<<" "<<cstw<<endl;
		}
//		for(int i=1;i<=6;i++)
//		{
//			cout<<c[i][0]<<" "<<c[i][1]<<endl;
//			cout<<i<<" fi "<<f[i]<<endl;
//			cout<<maxx[i][0]<<" "<<maxx[i][1]<<endl;
//			cout<<val[i]<<endl;
//		}
	}
	for(int i=cstw;i>=1;i--)
	{
		printf("%d\n",ans[i]);
	}
	return 0;
}
2020/5/12 16:39
加载中...