构造两颗深度为30的字典树(根节点分别是0和1),结点只有0和1,从根节点向下DFS,贪心取答案。

 #define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
vector<int>a;
int dfs(vector<int>b,int x){
if(x<||b.size()==)//30位都枚举完毕或当前向量中没有数字就中止
return ;
vector<int>c,d;
for(int i=;i<b.size();++i){
if((b[i]>>x)&)
c.push_back(b[i]);//当前位为1的数放进c
else
d.push_back(b[i]);//当前位为0的数放进d
}
if(c.size()==)//b中所有数字当前位都为1,那么可以把题意中X的当前位构造为1(假定这一位是1),异或下来这一位就是0
return dfs(d,x-);
else if(d.size()==)//b中所有数字当前位都为0,那么可以把题意中X的当前位构造为0(假定这一位是0),异或下来这一位就是0
return dfs(c,x-);
return (<<x)+min(dfs(c,x-),dfs(d,x-));//b中数字当前位有0也有1,那么题意中X的当前位无论取0还是1,异或下来这一位都会是1,所以这一位异或的贡献为(1<<x),然后加上c和d两组数当中更小的贡献
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin>>n;
for(int i=;i<=n;++i){
int temp;
cin>>temp;
a.push_back(temp);
}
int ans=dfs(a,);//二进制下从高位枚举,如果高位已经注定产生分支,那么就可以取低位贡献的最小值(低位贡献再大,合计也不会比高位某一位贡献大,所以取两个分支中较小的即可,较大的那一分支可以让它的高位异或为0,这样它低位的贡献也不会比另一分支要大。另一分支就可以贪心使得低位的贡献最小)
//(可以构造一棵深度为30,分支只有0或1的字典树)
cout<<ans;
return ;
}

Codeforces Round #613 (Div. 2)D(贪心,分治)的更多相关文章

  1. Codeforces Round #546 (Div. 2) D 贪心 + 思维

    https://codeforces.com/contest/1136/problem/D 贪心 + 思维 题意 你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则, ...

  2. Codeforces Round #613 Div.1 D.Kingdom and its Cities 贪心+虚树

    题目链接:http://codeforces.com/contest/613/problem/D 题意概述: 给出一棵树,每次询问一些点,计算最少删除几个点可以让询问的点两两不连通,无解输出-1.保证 ...

  3. Codeforces Round #547 (Div. 3) F 贪心 + 离散化

    https://codeforces.com/contest/1141/problem/F2 题意 一个大小为n的数组a[],问最多有多少个不相交的区间和相等 题解 离散化用值来做,贪心选择较前的区间 ...

  4. Codeforces Round #595 (Div. 3)D1D2 贪心 STL

    一道用STL的贪心,正好可以用来学习使用STL库 题目大意:给出n条可以内含,相交,分离的线段,如果重叠条数超过k次则为坏点,n,k<2e5 所以我们贪心的想我们从左往右遍历,如果重合部分条数超 ...

  5. Codeforces Round #554 (Div. 2) D 贪心 + 记忆化搜索

    https://codeforces.com/contest/1152/problem/D 题意 给你一个n代表合法括号序列的长度一半,一颗有所有合法括号序列构成的字典树上,选择最大的边集,边集的边没 ...

  6. Codeforces Round #303 (Div. 2) D 贪心

    D. Queue time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  7. Codeforces Round #545 (Div. 2) D 贪心 + kmp

    https://codeforces.com/contest/1138/problem/D 题意 两个01串s和t,s中字符能相互交换,问最多能得到多少个(可交叉)的t 题解 即将s中的01塞进t中, ...

  8. Codeforces Round #547 (Div. 3) G 贪心

    https://codeforces.com/contest/1141/problem/G 题意 在一棵有n个点的树上给边染色,连在同一个点上的边颜色不能相同,除非舍弃掉这个点,问最少需要多少种颜色来 ...

  9. Codeforces Round #228 (Div. 1) C 贪心

    嘎嘎,今天被一些事耽误了,可是还是A了几个题目,这道题还不错 题目链接: 题意:两个人玩游戏,有N堆纸牌,纸牌上有数字,A每次仅仅能取N堆中的 当中一个的顶部的 纸牌,B仅仅能取N堆中的当中一个底部 ...

随机推荐

  1. Android Q 使用通知栏消息

    String myChannelId = "iot"; String myChannelName = "告警通知服务"; NotificationManager ...

  2. [HNOI2004] 树的计数 - prufer序列

    给定树每个节点的 degree,问满足条件的树的数目. \(n\leq 150, ans \leq 10^{17}\) Solution 注意特判各种坑点 \(\sum d_i - 1 = n-2\) ...

  3. jsp中引用的jstl 和fmt标签-详解

    JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out.set.remove.catch 2.流程控制标签:if.choose.when.otherwise 3.循环标签:f ...

  4. 【Unity|C#】基础篇(9)——匿名函数 / Lambda表达式

    [学习资料] <C#图解教程>(第13章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu. ...

  5. Map merge

    将新的值赋值给map(如果不存在)或更新具有给定key的现有值. Map<Integer, Integer> map = new HashMap<>(); for (Integ ...

  6. vscode+vue 一些基本操作

    1.安装好 vscode 和 node.js 安装node.js是为了用npm(管理项目依赖) 2.调出终端 crtl +~ , 3.终端全局安装 vue-cli  安装整个脚手架,能快速给我们构建v ...

  7. Linux 虚拟机共享目录

    1.  开启linux虚拟机 2.   菜单“虚拟机” -------“重新安装 Vm tools” 3.   桌面看到 VmTools 安装盘 4.   安装 5.   设置中添加共享目录 5.   ...

  8. 基于Linq表达式做的一个简单的表达式生成器

    using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; ...

  9. Java基础之使用Scanner类获取用户输入

    创建 Scanner 对象的基本语法: Scanner s = new Scanner(System.in); Scanner 类的 next() 方法 import java.util.Scanne ...

  10. HTTP响应头 状态码

    HTTP 简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传 ...