求调,为何TLE
查看原帖
求调,为何TLE
1173419
hamster1695楼主2025/7/31 09:24

提交结果

前前后后试了很多次,都是01_random_19.txt错,我代码的时间复杂度应该是 O(Tn)O(T*n) ,为何会TLE.

代码有点长,已打注释.

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int T,n;
struct zbt
{
	int x,zf;//x数值,zf代表是正还是负 
}a[N];
bool cmp(zbt z1,zbt z2)
{
	if(z1.x!=z2.x)return z1.x<z2.x;//排序 
	return z1.zf!=z2.zf;
}
signed main()
{
	scanf("%lld",&T);
	while(T--)
	{
		scanf("%lld",&n);
		int z=0,f=0;//正负数量计数 
		for(int i=1;i<=n;i++)
		{
			scanf("%lld",&a[i].x);
			if(a[i].x<0)
			{
				a[i].zf=-1;
				f++;
			}
			else 
			{
				a[i].zf=1;
				z++;
			}
			a[i].x=abs(a[i].x);
		}
		sort(a+1,a+n+1,cmp);
		if(z==0||f==0)//如果数组全正/负 
		{
			int t=1;
			for(int i=2;i<n;i++)
				if(a[i].x*a[i].x!=a[i-1].x*a[i+1].x)//判断是否等比 
				{
					printf("No\n");
					t=0;
					break; 
				}
			if(t)printf("Yes\n");
		}
		else
		{
			//特判 
			/*
			  1
			  3
			  1 1 -1
			*/ 
			if(a[1].x==a[n].x)
			{
				if(z==f||abs(z-f)==1)printf("Yes\n");
				else printf("No\n");
				continue;
			}
			int t=1;
			if(a[1].zf==a[2].zf)
			{
				printf("No\n");
				continue;
			}
			for(int i=3;i<=n;i++)
			{
				if(a[i].x*a[1].x!=a[i-1].x*a[2].x||a[i].zf==a[i-1].zf)//判断是否等比 是否一正一负 
				{
					printf("No\n");
					t=0;
					break; 
				}
			}
			if(t)printf("Yes\n");
		}
	}
	return 0;
}
2025/7/31 09:24
加载中...