码迷,mamicode.com
首页 > 其他好文 > 详细

[CF1285D] Dr. Evil Underscores - 分治,dp

时间:2021-02-19 12:54:00      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:for   its   计算   with   ++   pre   最小   return   inline   

[CF1285D] Dr. Evil Underscores - 分治,dp

Description

给定一个长度为 n 的整数序列 a,找到一个自然数 x 使得 max(ai xor x) 最小。输出这个最小值。

Solution

做一个 trie 树上的 dp

对于 trie 树上每个节点,设 \(f[p]\) 表示这个节点子树内所有 x 选择的最小值

如果 trie 树某个结点的两个孩子有一个为空,那么我们显然会从非空的那一边转移

否则,我们在两边计算出的结果中取最小值

实际上我们只要模拟分治过程就可以了,没必要真的建立 trie 树

#include <bits/stdc++.h>
using namespace std;

int solve(vector<int> a, int k)
{
    if (k < 0)
        return 0;
    if (a.size() == 0)
        return 0;
    vector<int> ch[2];
    for (auto i : a)
        ch[(i >> k) & 1].push_back(i);
    if (ch[0].size() == 0)
        return solve(ch[1], k - 1);
    if (ch[1].size() == 0)
        return solve(ch[0], k - 1);
    return min(solve(ch[0], k - 1), solve(ch[1], k - 1)) + (1 << k);
}

signed main()
{
    ios::sync_with_stdio(false);
    int n;
    cin >> n;
    vector<int> a;
    for (int i = 1; i <= n; i++)
    {
        int x;
        cin >> x;
        a.push_back(x);
    }
    cout << solve(a, 30) << endl;
}

[CF1285D] Dr. Evil Underscores - 分治,dp

标签:for   its   计算   with   ++   pre   最小   return   inline   

原文地址:https://www.cnblogs.com/mollnn/p/14408176.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!