请帮忙分析下时间复杂度
  • 板块学术版
  • 楼主Fur_Zes
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/1/25 16:51
  • 上次更新2024/1/25 19:29:42
查看原帖
请帮忙分析下时间复杂度
157820
Fur_Zes楼主2024/1/25 16:51
#include<bits/stdc++.h>
using namespace std;
struct zhengs{
	int x,y;
	long long dis;
	int v;
}ris[2000005];
struct fus{
	int x,y;
	long long dis;
	int v;
}les[2000005];
struct zhengx{
	int x,y;
	long long dis;
	int v;
}rix[2000005];
struct fux{
	int x,y;
	long long dis;
	int v;
}lex[2000005];
struct stu{
	int x,y;
	long long z;
}a[2000005];
int n,x[2005],y[2005],m,fa[2005],k,you[2005],len;
unsigned long long cnt;
int getfa(int x)
{
	if(fa[x]!=x) fa[x]=getfa(fa[x]);
	return fa[x];
}
void unionn(int x,int y)
{
	int r1=getfa(x),r2=getfa(y);
	if(r1!=r2) fa[r1]=r2;
}
int xi(double xx)
{
	xx=abs(xx);
	while(xx<100000&&xx!=0) xx*=10;
	return abs((int)xx);
}
bool cmp(stu x,stu y)
{
	return x.z<y.z;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	cin>>x[i]>>y[i];
	for(int i=1;i<2003;i++)
	fa[i]=i;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(i!=j)
			{
				double xie;
				if(x[i]-x[j]==0) xie=1000001.00;
				else xie=(double)(y[i]-y[j])/(x[i]-x[j]);
				int xiee=xi(xie);
				you[++len]=xiee;
				long long ju=(long long)sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
				if(x[i]<=x[j])
				{
					if(y[j]>=y[i])
					{
						if(ris[xiee].v==1)
						{
							if(ris[xiee].dis>ju)
							{
								ris[xiee].dis=ju;
								ris[xiee].x=i;
								ris[xiee].y=j;
							}
						}	
						else
						{
							ris[xiee].dis=ju;
							ris[xiee].v=1;
							ris[xiee].x=i;
							ris[xiee].y=j;
						}
					}
					else
					{
						if(rix[xiee].v==1)
						{
							if(rix[xiee].dis>ju)
							{
								rix[xiee].dis=ju;
								rix[xiee].x=i;
								rix[xiee].y=j;
							}
						}
						else
						{
							rix[xiee].dis=ju;
							rix[xiee].v=1;
							rix[xiee].x=i;
							rix[xiee].y=j;
						}
					}
				}
				else
				{
					if(y[j]>=y[i])
					{
						if(les[xiee].v==1)
						{
							if(les[xiee].dis>ju)
							{
								les[xiee].dis=ju;
								les[xiee].x=i;
								les[xiee].y=j;
							}
						}
						else
						{
							les[xiee].dis=ju;
							les[xiee].v=1;
							les[xiee].x=i;
							les[xiee].y=j;
						}
					}
					else
					{
						if(lex[xiee].v==1)
						{
							if(lex[xiee].dis>ju)
							{
								lex[xiee].dis=ju;
								lex[xiee].x=i;
								lex[xiee].y=j;
							}
						}	
						else
						{
							lex[xiee].dis=ju;
							lex[xiee].v=1;
							lex[xiee].x=i;
							lex[xiee].y=j;
						}
					}
				}
			}
		}
		for(int k=1;k<=len;k++)
		{
			if(ris[you[k]].v!=0&&ris[you[k]].x!=0) a[++m].x=ris[you[k]].x,a[m].y=ris[you[k]].y,a[m].z=ris[you[k]].dis;
			if(les[you[k]].v!=0&&les[you[k]].x!=0) a[++m].x=les[you[k]].x,a[m].y=les[you[k]].y,a[m].z=les[you[k]].dis;
			if(rix[you[k]].v!=0&&rix[you[k]].x!=0) a[++m].x=rix[you[k]].x,a[m].y=rix[you[k]].y,a[m].z=rix[you[k]].dis;
			if(lex[you[k]].v!=0&&lex[you[k]].x!=0) a[++m].x=lex[you[k]].x,a[m].y=lex[you[k]].y,a[m].z=lex[you[k]].dis;
		}
		memset(ris,0,sizeof(ris));
		memset(les,0,sizeof(ris));
		memset(rix,0,sizeof(ris));
		memset(lex,0,sizeof(ris));
		memset(you,0,sizeof(you));
		len=0;
		
	}
	sort(a+1,a+m+1,cmp);
	for(int i=1;i<=m;i++)
	{
		if(getfa(a[i].x)!=getfa(a[i].y))
		{
			unionn(a[i].x,a[i].y);
			cnt+=a[i].z%191981000;
			k++;
		}
		if(k==n-1) break;
	}
	cout<<cnt%191981000;
	return 0;
}

RT,问了别人, O(n2log⁡n2)O(n^2\log n^2)

O(n4log⁡n+n2α(n))O(n^4 \log n + n^2α(n))

O(n2log⁡n)O(n^2 \log n)

O(n3)O(n^3) 都有

2024/1/25 16:51
加载中...