LOJ 6060「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set



$ solution: $

这一题的重点在于优先级问题,我们应该先保证总和最大,然后再保证某一个最小。于是我们分两部分贪心:(注意 $ tot $ 表示左右元素的异或和)

  1. 首先我们要让总和最大的话,我们只需要讨论 $ tot $ 的某一位为0的情况(如果为1,那么不管怎么分配两边的数都只能并且一定有一个数,使它这一位上含有1)。对于 $ tot $ 的某一位为0的情况,我们肯定贪心的让两边都在这一位上含有一!这个我们只需要让其中一个有一,另一个就必定有一。于是我们贪心的让 $ x2 $ 在这一位上尽量大
  2. 然后,我们要让左边最小,就只要再讨论 $ 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(线性基,贪心)的更多相关文章

  1. LOJ #6060. 「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set

    有趣的思博套路题,想到了基本上加上个对线性基的理解就可以过了 首先考虑到这个把数分成两半的分别异或的过程不会改变某一位上\(1\)的总个数 因此我们求出所有数的\(\operatorname{xor} ...

  2. Loj #6069. 「2017 山东一轮集训 Day4」塔

    Loj #6069. 「2017 山东一轮集训 Day4」塔 题目描述 现在有一条 $ [1, l] $ 的数轴,要在上面造 $ n $ 座塔,每座塔的坐标要两两不同,且为整点. 塔有编号,且每座塔都 ...

  3. Loj #6073.「2017 山东一轮集训 Day5」距离

    Loj #6073.「2017 山东一轮集训 Day5」距离 Description 给定一棵 \(n\) 个点的边带权的树,以及一个排列$ p\(,有\)q $个询问,给定点 \(u, v, k\) ...

  4. Loj 6068. 「2017 山东一轮集训 Day4」棋盘

    Loj 6068. 「2017 山东一轮集训 Day4」棋盘 题目描述 给定一个 $ n \times n $ 的棋盘,棋盘上每个位置要么为空要么为障碍.定义棋盘上两个位置 $ (x, y),(u, ...

  5. LOJ #6074. 「2017 山东一轮集训 Day6」子序列

    #6074. 「2017 山东一轮集训 Day6」子序列 链接 分析: 首先设f[i][j]为到第i个点,结尾字符是j的方案数,这个j一定是从i往前走,第一个出现的j,因为这个j可以代替掉前面所有j. ...

  6. loj #6077. 「2017 山东一轮集训 Day7」逆序对

    #6077. 「2017 山东一轮集训 Day7」逆序对   题目描述 给定 n,k n, kn,k,请求出长度为 n nn 的逆序对数恰好为 k kk 的排列的个数.答案对 109+7 10 ^ 9 ...

  7. LOJ #6119. 「2017 山东二轮集训 Day7」国王

    Description 在某个神奇的大陆上,有一个国家,这片大陆的所有城市间的道路网可以看做是一棵树,每个城市要么是工业城市,要么是农业城市,这个国家的人认为一条路径是 exciting 的,当且仅当 ...

  8. loj#6073. 「2017 山东一轮集训 Day5」距离(树链剖分 主席树)

    题意 题目链接 Sol 首先对询问差分一下,我们就只需要统计\(u, v, lca(u, v), fa[lca(u, v)]\)到根的路径的贡献. 再把每个点与\(k\)的lca的距离差分一下,则只需 ...

  9. loj#6074. 「2017 山东一轮集训 Day6」子序列(矩阵乘法 dp)

    题意 题目链接 Sol 设\(f[i][j]\)表示前\(i\)个位置中,以\(j\)为结尾的方案数. 转移的时候判断一下\(j\)是否和当前位置相同 然后发现可以用矩阵优化,可以分别求出前缀积和逆矩 ...

随机推荐

  1. Quartz快速上手

    快速上手你需要干啥: 下载Quartz 安装Quartz 根据你的需要来配置Quartz 开始一个示例应用 下载和安装 The Quartz JAR Files The main Quartz lib ...

  2. python学习笔记:(八)条件语句

    if语句,python中if语句的一般形式如下: conditon1为真,执行statement_block_1 condition1为假,判断conition_2,如果condition_2为真,执 ...

  3. JMV监控工具之JConsole

    一.简介 JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,它是Java自带的简单性能监控工具.下面以对tomcat的监控为例,带领大家熟悉JConsole这个工具. 二.配置 ...

  4. JSP———数据交互【1】

    JSP的内置对象 不用声明就可以在JSP页面中使用 request对象 内置对象 request 封装了用户提交的信息,主要用于处理客户端请求 <FORM action="tom.js ...

  5. 练习1:python设计停车入库出库系统

    前言: 最近在某个测试群看到有人抛出了一个面试题.为了提升自己的编程能力,我也尝试的用python去写了一下. 语言:python,数据库:sqlite  .菜鸟来袭,只是基本实现功能,可能没有考虑太 ...

  6. 【SD系列】SAP SD凭证处理被批次处理冻结

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[SD系列]SAP SD凭证处理被批次处理冻结 ...

  7. 添加linux中svn的用户和密码

    1:首先找到svn路径 find / -iname "svn" 一般找到svn路径之后就可以找到配置文件位置啦 svn/svnrepos/jgcp/conf 2:进入目录之后修改a ...

  8. diff patch比较文件打补丁

    比较文件将结果保存到patch文件:diff -u test1.txt test2.txt > patchfile test1.txt应用patch文件,并备份(test1.txt.orig): ...

  9. C语言I-博客作业05

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 C语言1博客作业05 我在这个课程的目标是 学会运用函数编代码 这个作业在那个具体方面帮助我实现目标 写C语言作业的时候,编代码的实践中 ...

  10. 华南理工大学 “三七互娱杯” G HRY and tree

    https://ac.nowcoder.com/acm/contest/874/G 题目大意:对于一个连通图,现在定义两个点的贡献为连接两点的路径上最大的权值 求任意两个点贡献的和 这个题看懂花了我很 ...