代码,一直找不到hack数据,CF显示wrong answer on test 2
#include<iostream>
#include<cmath>
#include<vector>
using namespace std;
long long n;
long long a[45];
vector<vector<long long>>e[2000005];
long long pr[45];
long long sz[45];
bool flag=false;
void inie()
{
for(long long i=1;i<=2000000;i++)
{
long long tmp=e[i].size();
for(long long j=0;j<tmp;j++)
{
e[i].pop_back();
}
}
}
void init()
{
for(long long i=1;i<=n;i++)
{
pr[i]=i;
sz[i]=1;
}
flag=false;
}
long long fnd(long long b)
{
if(pr[b]==b)
{
return b;
}
return pr[b]=fnd(pr[b]);
}
void unn(long long b,long long c)
{
if(fnd(b)==fnd(c))
{
return;
}
if(sz[pr[b]]<sz[pr[c]])
{
sz[pr[c]]=sz[pr[c]]+sz[pr[b]];
pr[pr[b]]=pr[c];
if(sz[pr[c]]>=(n+1)/2)
{
flag=true;
}
}
else
{
sz[pr[b]]=sz[pr[b]]+sz[pr[c]];
pr[pr[c]]=pr[b];
if(sz[pr[b]]>=(n+1)/2)
{
flag=true;
}
}
}
void pub(long long b,long long c,long long tmp)
{
vector<long long>emp;
emp.push_back(b);
emp.push_back(c);
e[tmp].push_back(emp);
}
void pb(long long b,long long c)
{
long long tmp=abs(a[b]-a[c]);
if(tmp==0)
{
pub(b,c,0);
}
for(long long i=1;i*i<=tmp;i++)
{
if(tmp%i==0)
{
pub(b,c,i);
if(i*i!=tmp)
{
pub(b,c,tmp/i);
}
}
}
}
int main()
{
long long v;
cin>>v;
for(long long u=1;u<=v;u++)
{
inie();
cin>>n;
for(long long i=1;i<=n;i++)
{
cin>>a[i];
}
for(long long i=1;i<=n;i++)
{
for(long long j=i+1;j<=n;j++)
{
pb(i,j);
}
}
init();
long long ans;
for(long long j=0;j<e[0].size();j++)
{
unn(e[0][j][0],e[0][j][1]);
if(flag)
{
cout<<-1<<endl;
break;
}
}
if(flag)
{
continue;
}
for(long long i=2000000;i>=1;i--)
{
for(long long j=0;j<e[i].size();j++)
{
unn(e[i][j][0],e[i][j][1]);
if(flag)
{
ans=i;
break;
}
}
if(flag)
{
break;
}
if(e[i].size()>0)
{
init();
}
}
cout<<ans<<endl;
}
return 0;
}
以下是我所使用的制造数据的代码
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
srand(time(0));
int t=rand()%10+1;
cout<<t<<endl;
for(int i=1;i<=t;i++)
{
int n=rand()%19*2+4;
cout<<n<<endl;
for(int j=1;j<=n;j++)
{
int a=rand()%2000001-1000000;
cout<<a;
if(j<n)
{
cout<<" ";
}
else
{
cout<<endl;
}
}
}
return 0;
}