题目链接:https://codeforces.com/contest/1501/problem/C
题目大意:个数,
,从中找出四个不同的数
,要求
,输出满足条件的任意的一组
题解:暴力枚举!
我们可以证明若存在四对数,那么其中一定可以找出四个不同的数,满足上述条件。
分类讨论:
若为的情况,那么显然
,我们可以选择
作为答案。
若为的情况,那么显然我们可以选择
作为答案。
其余情况,也一定可以从4对数中,选出两组数满足条件。
我们可以用图来证明,我们假设下标为点,若两个下标的数相加为,我们可以在两个点中建边。那么四条边,至少需要四个点。当点数为四个点时我们一定可以将四个点分为两组。当点数超过四个点时,就是上面我们讨论的情况。
由此,我们可以暴力枚举和值,对于一个和值
,当它出现四次的时候,我们一定可以找到答案。那么复杂度超过
,所以最终复杂度为
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int nn =210000;
const int inff = 0x3fffffff;
const double eps = 1e-8;
typedef long long LL;
const double pi = acos(-1.0);
const LL mod = 1000000007;
int n;
int a[nn];
vector<pair<int,int>> sum[nn*30];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
bool ans=false;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
int v=a[i]+a[j];
sum[v].push_back(make_pair(i,j));
if(sum[v].size()>=4)
{
cout<<"YES"<<endl;
for(int k=0;k<int(sum[v].size());k++)
{
if(sum[v][k].first!=i&&sum[v][k].first!=j)
{
if(sum[v][k].second!=i&&sum[v][k].second!=j)
{
ans=true;
cout<<sum[v][k].first<<" "<<sum[v][k].second<<" "<<i<<" "<<j<<endl;
}
}
if(ans)
break;
}
if(!ans)
{
ans=true;
if(sum[v][0].first == i)
{
cout<<sum[v][0].second<<" "<<sum[v][1].second<<" "<<sum[v][2].second<<" "<<j<<endl;
} else {
cout<<sum[v][0].first<<" "<<sum[v][1].first<<" "<<sum[v][2].first<<" "<<i<<endl;
}
}
} else {
for(int k=0;k<int(sum[v].size());k++)
{
if(sum[v][k].first!=i&&sum[v][k].first!=j)
{
if(sum[v][k].second!=i&&sum[v][k].second!=j)
{
ans=true;
cout<<"YES"<<endl;
cout<<sum[v][k].first<<" "<<sum[v][k].second<<" "<<i<<" "<<j<<endl;
}
}
if(ans)
break;
}
}
if(ans)
break;
}
if(ans)
break;
}
if(!ans)
cout<<"NO"<<endl;
return 0;
}