​原题链接​​ It was the third month of remote learning, Nastya got sick of staying at dormitory, so she decided to return to her hometown. In order to make her trip more entertaining, one of Nastya’s friend presented her an integer array a.

Several hours after starting her journey home Nastya remembered about the present. To entertain herself she decided to check, are there four different indices x,y,z,w such that ax+ay=az+aw.

Her train has already arrived the destination, but she still hasn’t found the answer. Can you help her unravel the mystery?

Input
The first line contains the single integer n (4≤n≤200000) — the size of the array.

The second line contains n integers a1,a2,…,an (1≤ai≤2.5⋅106).

Output
Print “YES” if there are such four indices, and “NO” otherwise.

If such indices exist, print these indices x, y, z and w (1≤x,y,z,w≤n).

If there are multiple answers, print any of them.

Examples
inputCopy
6
2 1 5 2 7 4
outputCopy
YES
2 3 1 6
inputCopy
5
1 3 1 9 20
outputCopy
NO
Note
In the first example a2+a3=1+5=2+4=a1+a6. Note that there are other answer, for example, 2 3 4 6.

In the second example, we can’t choose four indices. The answer 1 2 2 3 is wrong, because indices should be different, despite that a1+a2=1+3=3+1=a2+a3

题意:

给定一个2e5的序列,保证序列的每个数都小于2.5e5,请你找出四个不同的下标x,y,z,w,使得Codeforces1501——C. Going Home(鸽巢原理)_算法

思路:

比赛的时候想到了题解的思路,但是觉得Codeforces1501——C. Going Home(鸽巢原理)_算法_02的复杂度过不了。
后来看了看讨论区,其实当n足够大时,一定是有解的。一个数的范围是2.5e5,他们的和的范围为5e5,所以在有限次一定能得到答案。
当n比较小,没有答案时,时间复杂度才是Codeforces1501——C. Going Home(鸽巢原理)_算法_02
讨论区有人提出当n>=3162时一定出YES。

代码:

update:之前的代码fst了
正解:

#pragma
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll>PLL;
typedef pair<int, int>PII;
typedef pair<double, double>PDD;
#define
inline ll read()
{
ll x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9')
{
if(ch == '-')f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9')
{
x = x * 10 + ch - '0';
ch = getchar();
}
return x * f;
}
#define
#define
#define
#define
#define
#define
#define
ll ksm(ll a, ll b, ll p)
{
ll res = 1;
while(b)
{
if(b & 1)res = res * a % p;
a = a * a % p;
b >>= 1;
}
return res;
}
const int inf = 0x3f3f3f3f;
#define
const double eps = 1e-8;
const int maxn =5000005;
int n,a[maxn];
PII pos[maxn];
int main()
{
n=read;
rep(i,1,n) a[i]=read;
///sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
ll sum=a[i]+a[j];
if(pos[sum].first==0||pos[sum].second==0){
pos[sum].first=i;
pos[sum].second=j;
}
else if(pos[sum].first!=j&&pos[sum].second!=i&&pos[sum].first!=i&&pos[sum].second!=j){
puts("YES");
cout<<i<<" "<<j<<" "<<pos[sum].first<<" "<<pos[sum].second<<endl;
return 0;
}
}
}
puts("NO");
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll>PLL;
typedef pair<int,int>PII;
typedef pair<double,double>PDD;
#define
inline ll read()
{
ll x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
#define
#define
#define
#define
#define
#define
#define
ll ksm(ll a,ll b,ll p)
{
ll res=1;
while(b)
{
if(b&1)res=res*a%p;
a=a*a%p;
b>>=1;
}
return res;
}
const int maxn=2e5+100,inf=0x3f3f3f3f;
#define
int n,a[maxn];
int main()
{
n=read;
rep(i,1,n) a[i]=read;
map<int,PII>mp;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++){
int x=a[i]+a[j];
if(mp.count(x)){
int t1=mp[x].first,t2=mp[x].second;
if(i!=t1&&i!=t2&&j!=t1&&j!=t2){
puts("YES");
cout<<i<<" "<<j<<" "<<t1<<" "<<t2<<endl;
return 0;
}
}
mp[x]={i,j};
}
puts("NO");
return 0;
}