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)\)处放棋子,行和列会同时产生花费,且花费和该行该 ...
随机推荐
- JavaScript中的alert()与console.log()的区别
1.alert() [1.1]有阻塞作用,不点击确定,后续代码无法继续执行 [1.2]alert()只能输出string,如果alert输出的是对象会自动调用toString()方法 e.g. ale ...
- Apache Spark 章节1
作者:jiangzz 电话:15652034180 微信:jiangzz_wx 微信公众账号:jiangzz_wy 背景介绍 Spark是一个快如闪电的统一分析引擎(计算框架)用于大规模数据集的处理. ...
- Linux下删除乱码文件
删除乱码文件 一些文件乱码
- Python 自动化测试框架 unittest 和 pytest 对比
一.用例编写规则 1.unittest提供了test cases.test suites.test fixtures.test runner相关的类,让测试更加明确.方便.可控.使用unittest编 ...
- DoraBox 漏洞练习平台
项目地址: https://github.com/gh0stkey/DoraBox SQL注入 SQLi 数字型 判断表中有多少列 http://127.0.0.1/DoraBox/sql_inje ...
- 【转载】PyTorch系列 (二):pytorch数据读取
原文:https://likewind.top/2019/02/01/Pytorch-dataprocess/ Pytorch系列: PyTorch系列(一) - PyTorch使用总览 PyTorc ...
- elk的备份与恢复【转】
elasticsearch提供了快照功能: 1.在elsticsearch的配置文件中定义一个path.repo路径配置 path.repo: ["/elk/my_backup"] ...
- SQLServer删除重复行
1.如果有ID字段,就是具有唯一性的字段 delect table where id not in ( select max(id) from table group by col1,col2,col ...
- Codeforces Round #352 (Div. 2) (A-D)
672A Summer Camp 题意: 1-n数字连成一个字符串, 给定n , 输出字符串的第n个字符.n 很小, 可以直接暴力. Code: #include <bits/stdc++.h& ...
- 测试highlightjs主题1
package top.shaoxiu.scheduleTask; import org.springframework.scheduling.annotation.EnableScheduling; ...