根据题意,任意一对(i,j) i<j 都有唯一对应的结果。
那么两结果之间不同,则两对(i,j)不同。
因为N≤2e5,1≤a[i]≤2.5e6
则结果最多有5e6-1种
则当我们枚举 (i,j) 达到5e6-1个,所有结果必定都枚举过了。
所以第5e6次必定出现不同的 (i,j) 对应相同的结果。
考虑我们这样枚举会出现(i,j) (i,k)的情况。
所以稍微改变一下。
先选出任意一对 (i,j) ,若C(n-2,2)的结果都不相同的的话,则最多5e6-2种
所以当(n−2)(n−3)/2 ≥ 5e6-2 后,必定不能使结果不同。
综上,时间复杂度为O(min(√5e6,n^2)),完全ok。
#include<bits/stdc++.h> #define inf 0x3f3f3f3f #define MAX 1000001 #define inf 0x3f3f3f3f #define FR(a,b,c) for(int a=b;a<=c;++a) #define ll long long const ll N = 2e5+7; const ll M = 5e6+7; const ll mod = 1e9+7; using namespace std; int a[N]; struct{ int a,b; }q[M]; int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&a[i]); for(int i=1;i<=n;++i){ for(int j=i+1;j<=n;++j){ int res=a[i]+a[j]; if(q[res].a==0){ q[res].a=i; q[res].b=j; } else{ if(i!=q[res].a&&j!=q[res].b&&i!=q[res].b&&j!=q[res].a){ printf("YES "); printf("%d %d %d %d ",i,j,q[res].a,q[res].b); return 0; } } } } printf("NO "); return 0; }