BZOJ 4245: [ONTAK2015]OR-XOR 贪心 + 位运算
Description
Input
Output
依次从高位向低位枚举 :
根据二进制的性质,一个高位为 $0$ 肯定是要优于其后面的低位全部为 $0$ 的.
那么判断一个最高为可不可以为 $0$ 就是判断可不可以将 $n$ 个 0/1 数字分成 $m$ 段,其中每一段的异或和都为 $0$.
这等价于大于等于 $m$ 个前缀异或值为 $0$.
这个只需依次从 $1$ 到 $n$ 依次扫一遍前缀异或值即可,可以证明,这么做一定是最优的.
那么,还需满足的一个条件就是 $sum[n]$ 一定要等于 $0$ (因为这是对应最后一段的异或值).
先枚举 $64$ 位,再依次枚举 $1$ 到 $n$ ,并把一些前缀异或值不等于 $0$ 的打上标记,下一次循环时不能选即可
时间复杂度位 $O(64\times n)$
#include <bits/stdc++.h>
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std; const int maxn=500005; ll arr[maxn],sum[maxn];
int flag[maxn];
int main() {
// setIO("input");
int n,m;
ll ans=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%lld",&arr[i]), sum[i]=sum[i-1]^arr[i];
for(int i=62;i>=0;--i) {
int cnt=0;
for(int j=1;j<=n;++j) if(!flag[j]&&(sum[j]&(1ll<<i))==0) ++cnt;
if(cnt>=m&&(sum[n]&(1ll<<i))==0) {
for(int j=1;j<=n;++j) {
if(!flag[j]&&((1ll<<i)&sum[j])) flag[j]=1;
}
}
else ans|=(1ll<<i);
}
printf("%lld\n",ans);
return 0;
}
BZOJ 4245: [ONTAK2015]OR-XOR 贪心 + 位运算的更多相关文章
- bzoj 4245: [ONTAK2015]OR-XOR【按位贪心】
知道按位贪心但是不知道怎么贪-- 求一个a的异或前缀和s,然后按位从大到小贪心,ans的当前位能为0的条件是s中有>=m个位置这一位为0且没有flag,并且s[n]的这一位为0 如果符合要求,那 ...
- HYSBZ(BZOJ) 4300 绝世好题(位运算,递推)
HYSBZ(BZOJ) 4300 绝世好题(位运算,递推) Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<= ...
- BZOJ 4245: [ONTAK2015]OR-XOR
4245: [ONTAK2015]OR-XOR Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 492 Solved: 269[Submit][Sta ...
- UVA 10718 Bit Mask 贪心+位运算
题意:给出一个数N,下限L上限U,在[L,U]里面找一个整数,使得N|M最大,且让M最小. 很明显用贪心,用位运算搞了半天,样例过了后还是WA,没考虑清楚... 然后网上翻到了一个人家位运算一句话解决 ...
- P3613 睡觉困难综合征 LCT+贪心+位运算
\(\color{#0066ff}{ 题目描述 }\) 由乃这个问题越想越迷糊,已经达到了废寝忘食的地步.结果她发现--晚上睡不着了!只能把自己的一个神经元(我们可以抽象成一个树形结构)拿出来,交给D ...
- BZOJ 1087 互不侵犯King (位运算)
题解:首先,这道题可以用位运算来表示每一行的状态,同八皇后的搜索方法,然后对于限制条件不相互攻击,则只需将新加入的一行左右移动与上一行相&,若是0则互不攻击,方案可行.对于每种方案,则用递推来 ...
- BZOJ.4245.[ONTAK2015]OR-XOR(贪心)
题目链接 从高到低位贪心,判断答案的该位能否为0. 求一个前缀和sum.对于最高位,答案的这一位可以为0当且仅当至少存在m个位置满足sum[i]在这一位上为0. 注意sum[n]这一位必须为0. 如果 ...
- CF D. Ehab and the Expected XOR Problem 贪心+位运算
题中只有两个条件:任意区间异或值不等于0或m. 如果只考虑区间异或值不等于 0,则任意两个前缀异或值不能相等. 而除了不能相等之外,还需保证不能出现任意两个前缀异或值不等于m. 即 $xor[i]$^ ...
- ACM学习历程—HDU5269 ZYB loves Xor I(位运算 && dfs && 排序)(BestCoder Round #44 1002题)
Problem Description Memphis loves xor very musch.Now he gets an array A.The length of A is n.Now he ...
随机推荐
- LPVOID 指针 转 int
1 DWORD WINAPI SockUDP::RecvThread(LPVOID lparam){ //套接字 正确:int sock= *(int*)(lparam); 错误:int ...
- 如何使用 re模块的, spilt.
例: 这是一组 网卡的信息. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopb ...
- java方法形参是引用类型
public void 方法名(Student s) 这里形参需要的是该类的对象或者子类对象(父类引用子类对象). 1.若为普通类:则可传入该类的实例对象即可,方法名(new Student()): ...
- 【6.12校内test】T2 子集
这道题大概是这三道题里最简单的啦 但这阻止不了我废的脚步 [问题描述] 对于 n=4 时,对应的集合 s={4,3,2,1},他的非空子集有 15 个依次如下: {1} {2} {1,2} {3} { ...
- Luogu P4147 玉蟾宫
题目 就是全0子矩阵. 先预处理每个点上面有多少个连续的0(包括自己). 然后我们枚举下边界(1-n). 我们开一个单调栈,记录一个上界递增的矩形集合. 如果我们扫到了一个比当前栈顶要矮的矩形,那么我 ...
- Android快捷键大全
参考来源:https://mp.weixin.qq.com/s/T809p17Wt8XHkbLwcQf9ow 1,Ctrl + J 快捷代码列表 2,Ctrl+Alt+O 这个快捷键可以自动导包或删 ...
- mysql 加密 解密函数
select HEX(AES_ENCRYPT('你好世界','ABC123456')) select AES_DECRYPT(UNHEX('E85A104B6142A7375E53C0545C ...
- Python进阶编程 反射
1.7反射 python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) class Foo: f = '类的静态变量' def __init_ ...
- Java学习:通过Scanner读取文件
Scanner不仅能够读取用户的键盘输入,还可以读取文件输入. 需要在创建Scanner对象的时候传入一个File对象作为参数.代码如下: import java.util.Scanner; impo ...
- 初探css -11 Table表格
CSS 表格 使用 CSS 可以使 HTML 表格更美观. Company Contact Country Alfreds Futterkiste Maria Anders Germany Bergl ...