前前后后试了很多次,都是01_random_19.txt错,我代码的时间复杂度应该是 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;
}