Codeforce A. Going Home(Thinking + Rejection)

トピックリンク

トピックの主なアイデア: 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;
}

おすすめ

転載: blog.csdn.net/weixin_45911397/article/details/114777462