LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set(线性基,贪心)
LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set

$ solution: $
这一题的重点在于优先级问题,我们应该先保证总和最大,然后再保证某一个最小。于是我们分两部分贪心:(注意 $ tot $ 表示左右元素的异或和)
- 首先我们要让总和最大的话,我们只需要讨论 $ tot $ 的某一位为0的情况(如果为1,那么不管怎么分配两边的数都只能并且一定有一个数,使它这一位上含有1)。对于 $ tot $ 的某一位为0的情况,我们肯定贪心的让两边都在这一位上含有一!这个我们只需要让其中一个有一,另一个就必定有一。于是我们贪心的让 $ x2 $ 在这一位上尽量大
- 然后,我们要让左边最小,就只要再讨论 $ tot $ 的某一位为1的情况,我们肯定将这个1尽量分给 \(x2\) ,于是又是让 $ x2 $ 在这一位上尽量大!
这两个贪心是有优先级的,必须第一个贪完,第二个再贪!然后构造 $ x2 $ 最大,线性基最擅长,为了满足优先级我们先在 $ tot $ 的某一位为0的位上跑线性基,再在 $ tot $ 的某一位为1的位上跑线性基!
$ code: $
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define rg register int
using namespace std;
int n;
ll tot;
ll a[100005];
ll f[100005];
ll p[100005];
inline ll qr(){
register char ch; register bool sign=0; ll res=0;
while(!isdigit(ch=getchar()))if(ch=='-')sign=1;
while(isdigit(ch))res=res*10+(ch^48),ch=getchar();
if(sign)return -res; else return res;
}
inline void add(ll x){
for(rg i=60;i>=0;--i){ //第一优先级
if(!(tot&f[i])){ //先处理tot这一位为0的情况
if(x&f[i]){
if(p[i]) x^=p[i];
else{p[i]=x; return ;}
}
}
}
for(rg i=60;i>=0;--i){ //第二优先级
if(tot&f[i]){ //再处理tot这一位为1的情况
if(x&f[i]){
if(p[i]) x^=p[i];
else{p[i]=x; return ;}
}
}
}
}
inline ll ask(){
ll res=0;
for(rg i=60;i>=0;i--) //同理先保证全局最大
if(!(tot&f[i])&&!(res&f[i])) res^=p[i];
for(rg i=60;i>=0;i--) //然后保证单个最小(就是另一个最大)
if(tot&f[i]&&!(res&f[i])) res^=p[i];
return res;
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=qr(); f[0]=1;
for(rg i=1;i<=60;++i) f[i]=f[i-1]<<1; //预处理
for(rg i=1;i<=n;++i) a[i]=qr(),tot^=a[i]; //读入,统计tot
for(rg i=1;i<=n;++i) add(a[i]); //逐个加入
printf("%lld\n",tot^ask());
return 0;
}
LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set(线性基,贪心)的更多相关文章
- LOJ #6060. 「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set
有趣的思博套路题,想到了基本上加上个对线性基的理解就可以过了 首先考虑到这个把数分成两半的分别异或的过程不会改变某一位上\(1\)的总个数 因此我们求出所有数的\(\operatorname{xor} ...
- Loj #6069. 「2017 山东一轮集训 Day4」塔
Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...
- Loj #6073.「2017 山东一轮集训 Day5」距离
Loj #6073.「2017 山东一轮集训 Day5」距离 Description 给定一棵 \(n\) 个点的边带权的树,以及一个排列$ p\(,有\)q $个询问,给定点 \(u, v, k\) ...
- Loj 6068. 「2017 山东一轮集训 Day4」棋盘
Loj 6068. 「2017 山东一轮集训 Day4」棋盘 题目描述 给定一个 $ n \times n $ 的棋盘,棋盘上每个位置要么为空要么为障碍.定义棋盘上两个位置 $ (x, y),(u, ...
- LOJ #6074. 「2017 山东一轮集训 Day6」子序列
#6074. 「2017 山东一轮集训 Day6」子序列 链接 分析: 首先设f[i][j]为到第i个点,结尾字符是j的方案数,这个j一定是从i往前走,第一个出现的j,因为这个j可以代替掉前面所有j. ...
- loj #6077. 「2017 山东一轮集训 Day7」逆序对
#6077. 「2017 山东一轮集训 Day7」逆序对 题目描述 给定 n,k n, kn,k,请求出长度为 n nn 的逆序对数恰好为 k kk 的排列的个数.答案对 109+7 10 ^ 9 ...
- LOJ #6119. 「2017 山东二轮集训 Day7」国王
Description 在某个神奇的大陆上,有一个国家,这片大陆的所有城市间的道路网可以看做是一棵树,每个城市要么是工业城市,要么是农业城市,这个国家的人认为一条路径是 exciting 的,当且仅当 ...
- loj#6073. 「2017 山东一轮集训 Day5」距离(树链剖分 主席树)
题意 题目链接 Sol 首先对询问差分一下,我们就只需要统计\(u, v, lca(u, v), fa[lca(u, v)]\)到根的路径的贡献. 再把每个点与\(k\)的lca的距离差分一下,则只需 ...
- loj#6074. 「2017 山东一轮集训 Day6」子序列(矩阵乘法 dp)
题意 题目链接 Sol 设\(f[i][j]\)表示前\(i\)个位置中,以\(j\)为结尾的方案数. 转移的时候判断一下\(j\)是否和当前位置相同 然后发现可以用矩阵优化,可以分别求出前缀积和逆矩 ...
随机推荐
- leetcode-mid-sorting and searching - 56 Merge Intervals
mycode 出现的问题:比如最后一个元素是[1,10],1小于前面所有元素的最小值,10大于前面所有元素的最大值,而我最开始的思路只考虑了相邻 参考: 思路:如果我只考虑相邻,必须先将list排序, ...
- 基本vim快捷键
w,e等单词间跳转,英文字符(除了_),数字,符号,空格 都被vim独立看成独立的词
- 线性时间求取第 K 大数
求 Top K 的算法主要有基于快速排序的和基于堆的这两种,它们的时间复杂度都为 \(O(nlogK)\).借助于分治思想,以及快速排序的区间划分,我们可以做到 \(O(n)\) 时间复杂度.具体算法 ...
- 1、node-webkit 的概念,node-webkit 的下载
node-webkit是一个基于node.js和chromium的应用程序运行环境,通过它我们可以把建立在chrome浏览器和node.js上的web应用打包成桌面应用,而且还可以跨平台的哦.很显然比 ...
- Openstack_单元测试工具 tox
目录 目录 扩展阅读 Openstack 的单元测试工具 单元测试工具使用流程 tox toxini 参考文章 扩展阅读 Python Mock的入门 Openstack 的单元测试工具 unitte ...
- 封装一个windows转发端口的脚本
使用方法: 1.打开文本编辑工具如(Notepad++) 2.新建文件 3.注意:修改文本的编码字符集为:gb2312 4.将下面代码 复制入文件 5.保存文件名为:transmit.bat 6.双击 ...
- 获取win10壁纸
执行命令会将所有壁纸拷贝到桌面上的wallpaper文件夹内 bat xcopy %LOCALAPPDATA%\Packages\Microsoft.Windows.ContentDeliveryMa ...
- 【Qt开发】Qt让线程休息一段时间
Qt 为何没有提供 Sleep 论坛上不时见到有人问: Qt 为什么没有提供跨平台的 sleep 函数? 使用平台相关的 Sleep 或 nanosleep 以后,界面为什么没有反应? QThread ...
- 一、Zabbix-学习列表
近期本人在求职,面试了几家,觉得监控是一个很重要的事情,所以决定深入学习一下监控.目前的监控系统有很多,Zabbix是目前应用最广泛的开源监控之一,功能比较完善,所以决定学习一下. 目前将学习zabb ...
- vue element 导出 分页数据的excel表格
1.安装相关依赖 npm install --save xlsx file-saver 2.导入相关插件 在组建头部导入相关插件 const FileSaver = require("fil ...