异常好奇,为什么数组开10w不能过,开100w才能过
查看原帖
异常好奇,为什么数组开10w不能过,开100w才能过
46694
少帅_zjm楼主2021/3/4 15:51
#include<bits/stdc++.h>
using namespace std;
int f[100000],dang[100000],da[100000],d[100000];
int father[100000];
int find(int x)
{
	if(x!=father[x])
	{
		father[x]=find(father[x]);
	}
	return father[x];
}
int he(int x,int y)
{
	father[x]=y;
	int a=da[x],b=da[y];
	if(a<=b)
	{
		f[x]=d[y];
//		d[y]=d[x];
		int xx=d[x];
        int jian=dang[d[y]]+da[x];
		int t=da[x];
		while(t--)
		{
			dang[xx]=jian;
			xx=f[xx];
			jian--;
//			if(xx=d[y]) break;
		};
		d[y]=d[x];
		da[y]+=da[x];
	}
	else
	{
		f[x]=d[y];
//		d[y]=d[x];
		int xx=d[y];
		int jian=dang[x]-1;
		int t=da[y];
		while(t--)
		{
			dang[xx]=jian;
			xx=f[xx];
			jian--;	
		};
		d[y]=d[x];
		da[y]+=da[x];
	}
	
}
int main()
{
// 	freopen("in.txt","r",stdin);
	std::ios::sync_with_stdio(false);
	int n;
	cin>>n;
//	getchar();
	for(int i=1;i<=n;i++) f[i]=i,father[i]=i,d[i]=i,da[i]=1,dang[i]=0;
//	for(int i=1;i<=n;i++) cout<<"father="<<find(i)<<endl;
	for(int i=1;i<=n;i++)
	{
		char c;
		cin>>c;
//		scanf("%c",&c);
//        cin>>c;
//		cout<<c<<endl;
//		getchar();
		int x,y;
//		scanf("%d%d",&x,&y);
 		cin>>x>>y;
		int xx=find(x),yy=find(y);
//		cout<<xx<<" "<<yy<<endl;
		if(c=='M')
		{
		   if(xx!=yy) he(xx,yy);
		}
		else 
	    {
	    	if(xx!=yy) cout<<"-1"<<endl;
	    	else
	    	{
	    		cout<<abs(dang[x]-dang[y])-1<<endl;
			}
		}
//		for(int i=1;i<=n;i++) cout<<"dang="<<dang[i]<<endl;
	}
//	for(int i=1;i<=n;i++) cout<<"father="<<find(i)<<endl;
//	for(int i=1;i<=n;i++) cout<<"dang="<<dang[i]<<endl;
}
//记录每条队列的总长度,及时调整在队列中的位置
//记录底部,从底部开始调起,有可能需要o(n)
//如果灵活调整上下层可能只需要o(1),但是需要加入并查集的优化
//需要维护两个不同的并查集一个查询,一个进行层数的控制 
2021/3/4 15:51
加载中...