C. Going Home

根据题意,任意一对(i,j)  i<j 都有唯一对应的结果。

那么两结果之间不同,则两对(i,j)不同。

因为N2e5,1a[i]2.5e6

则结果最多有5e6-1种

则当我们枚举 (i,j) 达到5e6-1个,所有结果必定都枚举过了。

所以第5e6次必定出现不同的 (i,j) 对应相同的结果。

考虑我们这样枚举会出现(i,j) (i,k)的情况。

所以稍微改变一下。

先选出任意一对 (i,j) ,若C(n-2,2)的结果都不相同的的话,则最多5e6-2种

所以当(n2)(n3)/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\n");
                    printf("%d %d %d %d\n",i,j,q[res].a,q[res].b);
                    return 0;
                }
            }
        }
    }
    printf("NO\n");
    return 0;
}

 

posted @ 2021-03-15 15:45  PdrEam  阅读(92)  评论(0编辑  收藏  举报