トピックの主なアイデア: nを与え、ax + ay = az + aw a_x + a_y = a_z + a_wを満たすために互いに異なる4つの添え字を見つけましょうaX+aそして=aから+aワット。
アイデア:実際、彼から与えられたデータnは2e 5であり、彼のai a_iであるため、この質問を理解するのは実際には簡単ではありません。a私それは2.5Eである6で初見のnそれは2Eで5複雑さはO(n個であることは不可能でなければならないことを意味し、2次に、あなただけの別の方法を見つけることができます)。。一般的に、あなたは列挙のと思うが、この問題は難しい難しいのは、彼があなたに列挙させることができないということです。しかし、あなたはそれをすることができません。それで、探し続けましょう。私たちは、ax + ay = S a_x + a_y = Sを見つけなければなりません。aX+aそして=Sにはaz + zw = S a_z + z_w = Sもありますaから+とワット=Sおよびx、y、z、wx、y、z、wx 、および、と、wが等しくない場合、彼の最大のSは5e6であることがわかります。したがって、答えがある場合、これらの数値は(0、5e6)の範囲内にある必要があります。これは、各数値が最大で1回、最悪の場合に表示されるためです。この範囲のすべての番号をカバーする状況です。別の番号に到達した場合でも、この間隔内にある必要があります。元の間隔に1つの番号のペアがあり、次のペアで要件を満たします。これは答えの最悪のケースです。これは、鳩の檻を許容するために学んだことと似て
います。答えが見つからない場合、すべての数値を列挙した後、要件を満たす2つのペアが見つかりません。 、および複雑さはO(n *(n-1)/ 2)です。
最終的な複雑さはすべてO(min(2C、n(n-1)/ 2));、
つまりn *( n-1)/ 2が2Cより大きい場合、2Cで答えが見つかったはずであり、列挙を続行しません。
#include <set>
#include <map>
#include <queue>
#include <string>
#include<iostream>
#include<stdio.h>
#include<string.h>
#include <algorithm>
#include <math.h>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
typedef pair<ll,ll> pii;
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define mem(a,x) memset(a,x,sizeof(a))
#define debug(x) cout << #x << ": " << x << endl;
#define rep(i,n) for(int i=0;i<(n);++i)
#define repi(i,a,b) for(int i=int(a);i<=(b);++i)
#define repr(i,b,a) for(int i=int(b);i>=(a);--i)
const int maxn=5e6+10;
#define inf 0x3f3f3f3f
#define sf scanf
#define pf printf
const int mod=1e9+7;
const int MOD=1e9+7;
inline int read() {
int x=0;
bool t=false;
char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
ll n,m,d;
ll a[maxn];
ll x[maxn],y[maxn];
int main() {
cin>>n;
for(int i=1; i<=n; i++) {
scanf("%lld",&a[i]);
}
for(ll i=1; i<=n; i++) {
for(ll j=i+1; j<=n; j++) {
ll sum=a[i]+a[j];
if(x[sum]!=i&&x[sum]!=j&&y[sum]!=i&&y[sum]!=j) {
if(x[sum]&&y[sum]) {
puts("YES");
printf("%lld %lld %lld %lld\n",x[sum],y[sum],i,j);
return 0;
}
}
x[sum]=i;
y[sum]=j;
}
}
puts("NO");
return 0;
}