Codeforcesラウンド#613(DIV 2)最小値または最大値の排他的(パーティション)

Dr.イーブルアンダースコア

今日では、友情の贈り物として、BakryはBadawy nnは整数A1、A2、...、ANA1、A2、...、および、そのような値max1≤i≤n(ai⊕X)max1≤iその整数XXを選択するために彼に挑戦しました⊕⊕を表す≤n(ai⊕X)は、最小可能である  ビット単位のXOR演算を

あなたが彼を助けるとmax1≤i≤n(ai⊕X)max1≤i≤n(ai⊕X)の可能な最小値を見つけることにしましたので、いつものように、Badawyは、あまりにも怠惰です。

入力

最初の行は、NN(1≤n≤1051≤n≤105)整数含ま。

2行目はNN整数A1、A2、...、ANA1、A2、...、(0≤ai≤230-10≤ai≤230-1)が含まれています。

出力

max1≤i≤nの最小可能値(ai⊕X)max1≤i≤n(ai⊕X) - オン整数を印刷します。

リンク:http://codeforces.com/contest/1285/problem/D

問題の意味:、xおよびXORアレイ、又は発散アレイ内の最大値を探し、その最小値と最大そう。

解決策:分割統治の辞書の木のDPが(完了するDP)

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
using ll = long long;
ll solve(vector<ll> a,int b)
{
    if(b==-1)return 0;
    ll temp = 1ll<<b;
    vector<ll> l, r;
    for(auto i:a)
	{
        if(i<temp)l.push_back(i);
        else r.push_back(i-temp);
    }
    if(l.empty())return solve(r,b-1);
    if(r.empty())return solve(l,b-1);
    return min(solve(l,b-1),solve(r,b-1))+temp;
}
int main(){
    int n;
    cin>>n;
    vector<ll> a(n);
    for(int i=0;i<n;i++)
	cin>>a[i];
    sort(a.begin(),a.end());
    cout<<solve(a,32)<<endl;
    return 0;
}

 

发布了39 篇原创文章 · 获赞 27 · 访问量 4087

おすすめ

転載: blog.csdn.net/qq_43381887/article/details/104074071