LOJ.6060.[2017山东一轮集训Day1/SDWC2018Day1]Set(线性基)
明明做过一道(最初思路)比较类似的题啊,怎么还是一点思路没有。
记所有元素的异或和为\(s\),那么\(x_1+x_2=x_1+x_1\ ^{\wedge}s\)。
\(s\)是确定的。考虑从高位到低位枚举\(s\)的二进制位。若当前位\(s\)为\(1\),则\(x_1\)是\(0\)是\(1\)贡献相同;否则\(x_1\)这一位必须是\(1\)(如果能是\(1\))。这样可以满足\(x_1+x_2\)最大。
对于\(x_1\)最小的要求,就是在\(s\)为\(1\)时,\(x_1\)能取\(0\)就取\(0\)。
这种逐位\(\text{xor}\)的,考虑构造线性基。
原来的线性基是以从高位到低位为优先级的。而现在是,\(s\)为\(0\)的位优先级最高,其次高位优先级最高。
那么在把一个数插入到线性基里时,优先选\(s\)为\(0\)的位插入,然后再去尝试插入\(s\)为\(1\)的位。(如果第一次不能插入进去,说明不会对\(s\)为\(0\)的位产生影响啊,也就不会影响\(x_1+x_2\)最大了)
求\(x_1\)时令\(s\)为\(0\)的位尽量为\(1\),其次\(s\)为\(1\)的位尽量为\(0\)即可。
//2092kb 424ms
#include <cstdio>
#include <cctype>
#include <algorithm>
#define BIT 59
#define gc() getchar()
#define MAXIN 500000
//#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
typedef long long LL;
const int N=1e5+5;
LL A[N],base[BIT+2];
char IN[MAXIN],*SS=IN,*TT=IN;
inline LL read()
{
LL now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
inline void Insert(LL x,LL s)
{
for(int i=BIT; ~i; --i)
if(!(s>>i&1) && x>>i&1)
if(base[i]) x^=base[i];
else {base[i]=x; return;}
for(int i=BIT; ~i; --i)
if(/*s>>i&1 &&*/ x>>i&1)
if(base[i]) x^=base[i];
else {base[i]=x; return;}
}
int main()
{
const int n=read(); LL s=0;
for(int i=1; i<=n; ++i) s^=A[i]=read();
for(int i=1; i<=n; ++i) Insert(A[i],s);
LL ans=0;
for(int i=BIT; ~i; --i) if(!(s>>i&1) && !(ans>>i&1)) ans^=base[i];
for(int i=BIT; ~i; --i) if(s>>i&1 && ans>>i&1) ans^=base[i];
printf("%lld\n",ans);
return 0;
}
LOJ.6060.[2017山东一轮集训Day1/SDWC2018Day1]Set(线性基)的更多相关文章
- LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set(线性基,贪心)
LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set $ solution: $ 这一题的重点在于优先级问题,我们应该先保证总和最大,然后再保证某一个最小.于是我 ...
- LOJ #6060. 「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set
有趣的思博套路题,想到了基本上加上个对线性基的理解就可以过了 首先考虑到这个把数分成两半的分别异或的过程不会改变某一位上\(1\)的总个数 因此我们求出所有数的\(\operatorname{xor} ...
- LOJ.6066.[2017山东一轮集训Day3]第二题(树哈希 二分)
LOJ 被一件不愉快的小事浪费了一个小时= =. 表示自己(OI方面的)智商没救了=-= 比较显然 二分+树哈希.考虑对树的括号序列进行哈希. 那么每个点的\(k\)子树的括号序列,就是一段区间去掉距 ...
- loj6102 「2017 山东二轮集训 Day1」第三题
传送门:https://loj.ac/problem/6102 [题解] 贴一份zyz在知乎的回答吧 https://www.zhihu.com/question/61218881 其实是经典问题 # ...
- loj6100 「2017 山东二轮集训 Day1」第一题
传送门:https://loj.ac/problem/6100 [题解] 我们考虑维护从某个端点开始的最长满足条件的长度,如果知道了这个东西显然我们可以用主席树来对每个节点建棵关于右端点的权值线段树, ...
- 【LOJ6060】【2017 山东一轮集训 Day1 / SDWC2018 Day1】Set 线性基
题目大意 给出 \(n\) 个非负整数,将数划分成两个集合,记为一号集合和二号集合.\(x_1\) 为一号集合中所有数的异或和,\(x_2\) 为二号集合中所有数的异或和.在最大化 \(x_1 + x ...
- LOJ.6073.[2017山东一轮集训Day5]距离(可持久化线段树 树链剖分)
题目链接 就是恶心人的,简单写写了...(似乎就是[HNOI2015]开店?) 拆式子,记\(dis_i\)为\(i\)到根节点的路径权值和,\(Ans=\sum dis_{p_i}+\sum dis ...
- LOJ.6074.[2017山东一轮集训Day6]子序列(DP 矩阵乘法)
题目链接 参考yww的题解.本来不想写来但是他有一些笔误...而且有些地方不太一样就写篇好了. 不知不觉怎么写了这么多... 另外还是有莫队做法的...(虽然可能卡不过) \(60\)分的\(O(n^ ...
- LOJ.6068.[2017山东一轮集训Day4]棋盘(费用流zkw)
题目链接 考虑两个\(\#\)之间产生的花费是怎样的.设这之间放了\(k\)个棋子,花费是\(\frac{k(k-1)}{2}\). 在\((r,c)\)处放棋子,行和列会同时产生花费,且花费和该行该 ...
随机推荐
- xin
测试文件 行内公式 y = x 独立公式 limx → 0x = 0
- Kafka(二)设计原理
1.持久性 kafka使用文件存储消息,这就直接决定kafka在性能上严重依赖文件系统的本身特性.且无论任何OS下,对文件系统本身的优化几乎没有可能.因为kafka是对日志进行append操作,因此磁 ...
- C语言strcpy,strncpy和strlcpy讲解
前言 C风格的字符串处理函数有很多,如strcpy().strcat()等等. strcpy与strcat char* strcpy (char* dest, const char* src); ch ...
- Android Studio安装后配置默认新工程目录以及.gradle,.android,.m2和system,config目录
关于在哪里设置:以下所有设置都是在没有打开工程的前提下设置的, Configure > Settings 如图: 不要使用 Configure > Project Defaults> ...
- python安装过程中的一些问题
因为看到大神的教程是基于python V2.7,下载该版本且安装成功. 安装目录: https://www.python.org/download/releases/2.7/ 根据系统进行安装包下载 ...
- mysql 从一个表查询数据插入另一个表或当前表
mysql insert into 表明(uid,lng,lat) SELECT uuid,lng,lat FROM 表明
- computed计算属性
在computed中,可以定义一些属性,这些属性 叫做计算属性.计算属性的本质是一个方法,只不过我们在使用的时候,把他们的名称当做属性来使用,并不会吧计算属性当做方法去调用.与methods平级. / ...
- form 组件
https://www.cnblogs.com/wupeiqi/articles/6144178.html class F2Form(forms.Form): title1=fields.CharFi ...
- 笔记,ajax,事件绑定,序列化
1. Python序列化 字符串 = json.dumps(对象) 对象->字符串 对象 = json.loads(字符串) 字符串->对象 JavaScript: 字符串 = JSON. ...
- 企业SVN版本控制服务器搭建
服务器端配置 svn安装部署 查看系统环境 cat /etc/redhat-release uname -a 安装svn yum install -y subversion 配置并启动svn 建立sv ...