求助,求可手算的小数据
查看原帖
求助,求可手算的小数据
174399
fzwfzwfzw楼主2020/5/11 21:04

或许有人能帮我看看代码

#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 cst;
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];
	}
}
int nroot(int x)
{
	return (c[f[x]][0]==x)||(c[f[x]][1]==x);
}
void rotate(int x)
{
	int y=f[x],z=f[y],s=c[y][1]==x;
	c[y][s]=c[x][!s];f[c[x][!s]]=y;
	f[x]=z;if(nroot(y))c[z][c[z][1]==y]=x;
	f[c[x][!s]=y]=x;ph(y);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 splay(int x)
{
	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);
	}
}
void access(int x)
{
	for(int y=0;x;x=f[y=x])
	{
		splay(x);
		c[x][1]=y;
		ph(x);
	}
}
void evert(int x)
{
	access(x);
	splay(x);
	rv(x);
}
void link(int x,int y)
{
	evert(x);
	f[x]=y;
}
void cut(int x,int y)
{
	evert(x);
	access(y);
	splay(x);
	f[y]=c[x][1]=0;
	ph(x);
}
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();
	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)
		{
			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<<cnts<<endl;
//			cout<<uu[cnts]<<" "<<vv[cnts]<<endl;
			val[cnts]=e[i].c;
			link(cnts,e[i].a);
			link(cnts,e[i].b);
		}
	}
	for(int i=q;i>=1;i--)
	{
		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<<maxx[b][1]<<endl;
//				cout<<uu[maxx[b][1]]<<" "<<vv[maxx[b][1]]<<endl;
				cut(maxx[b][1],uu[maxx[b][1]]);
				cut(maxx[b][1],vv[maxx[b][1]]);
				++cnts;
				uu[cnts]=a;
				vv[cnts]=b;
				val[cnts]=c;
				link(cnts,a);
				link(cnts,b);
			}
		}
		if(w[i][0]==1)
		{
			int a,b;
			a=w[i][1];
			b=w[i][2];
			evert(a);
			access(b);
			splay(b);
			ans[++cst]=maxx[b][0];
		}
	}
	for(int i=cst;i>=1;i--)
	{
		printf("%d\n",ans[i]);
	}
	return 0;
}

oj wa

luogu不知为何MLE(我没开爆呀QWQ)

2020/5/11 21:04
加载中...