zoukankan      html  css  js  c++  java
  • Codeforces 1285D Dr. Evil Underscores(字典树,dp)

    传送门

    题意:

    有一个长度为 (n (1leq nleq 10^5))的整数序列 (a_1,cdots,a_n (0leq a_ileq 2^{30}-1)),你需要找到一个非负整数 (X) 使得 (max(a_ioplus X))最小,其中 (oplus) 为按位异或运算。

    输入这个序列,输出(max(a_ioplus X))的最小值。

    思路:

    1.数组中的每个数的二进制下的某位(第k位)都是0或者是1,那么x的第k位取值是0或者1,使得答案中的第k位一定是0(这样得到的结果才会更小)。
    2.数组中的每个数的二进制下的某位(第k位)有1又有0,不管x的第k位取得0或1,异或后的结果都是1(因为我们找的是(max(a_ioplus X)),只要有1肯定要算)。所得答案的第k位一定是1,然后取最小的值对于剩下的k-1位(递归就行)。

    代码:

    //借鉴了qscqesze大佬的代码,写的很漂亮,我加上了注释 
    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    #include <string.h>
    #include <vector>
    #include <math.h>
    #include <map>
    #include <queue>
    #include <set>
    using namespace std;
    typedef long long ll;
    const int mod=998244353;
    const int MAXN=2e5+50;
    const double pi=3.1415926536;
    int t,n;
    vector<int> a;
    int solve(vector<int> p,int k){
        if(p.size()==0||k<0)return 0;
        vector<int> p1,p2;
        for(int i=0;i<p.size();i++){
            if((p[i]>>k)&1)p1.push_back(p[i]);//第k位是1的放p1里
            else p2.push_back(p[i]);//第k位是0的放p2里
        }
        if(p1.size()==0)return solve(p2,k-1);//p1里面没元素,说明所有的第k位都是0,答案的第k位为0,只用考虑p2的后面k-1位即可
        if(p2.size()==0)return solve(p1,k-1);//p2里面没元素,说明所有的第k位都是1,答案的第k位为0,只用考虑p1的后面k-1位即可
        return (1<<k)+min(solve(p1,k-1),solve(p2,k-1));//答案的第k位为1,值为(1<<k),考虑后面k-1位里,p1,p2能够取得的最小值,贪心
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            int x;
            scanf("%d",&x);
            a.push_back(x);
        }
        printf("%d
    ",solve(a,30));
        return 0;
    }
    

    Summary

    解决的代码类似贪心,但好多大佬说这是字典树模版题,这个代码也用到了字典树的思想,只是不用建树,直接解决的。这个还用用dp写的,意思是树上dp,其实思路差不多,dp的话就是不用递归直接在数组里算出来输出就行.
    
  • 相关阅读:
    省选前模拟
    $SA$后缀数组
    一键运行
    多项式$fft$,$ntt$,$fwt$初步
    插头$DP$初步
    网络流初步
    欧拉路相关
    模板—Hash_map
    HZOJ Function
    HZOJ Tree
  • 原文地址:https://www.cnblogs.com/zzl_Alexander/p/12228827.html
Copyright © 2011-2022 走看看