4245: [ONTAK2015]OR-XOR

https://www.lydsy.com/JudgeOnline/problem.php?id=4245

  1. /*
  2. 要求分成m份,总价值为a1|a2|a3...,总价值最小,ai为第i份的异或和。
  3.  
  4. 首先预处理异或和。
  5. 根据贪心的思想,高位最好是0。
  6. 于是从高位往低位枚举,看一下每一位是否可以为0。
  7. 如果当前这一位可以为0,每一份的(异或和)(或)起来都是0,所以每一份异或和的这一位不能有1
  8. 那么一个点可以成为分割点当且仅当这个点的sum值的这一位为0,然后统计有多少个点的sum为0
  9. 如果个数>=m且这一位上的所有1为偶数个(sum[n]&(1LL<<i)==0),那么这一位可以为0,然后对于那些不能成为分割点的点,标记不能再成为分割点。
  10. 不然会使这一位不为0了。
  11. 如果不能0,那就为1了,ans更新。
  12. */
  13. #include<bits/stdc++.h>
  14. using namespace std;
  15. typedef long long LL;
  16.  
  17. inline LL read() {
  18. LL x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
  19. for (;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
  20. }
  21.  
  22. const int N = ;
  23. LL a[N],sum[N],flag[N];
  24.  
  25. int main() {
  26. int n,m;cin >> n >> m;
  27. for (int i=; i<=n; ++i)
  28. a[i] = read(),sum[i] = sum[i-] ^ a[i];
  29. LL ans = ;
  30. for (int i=; i>=; --i) { // 看第i位能否为0
  31. int cnt = ;
  32. for (int j=; j<=n; ++j) { // 统计有多少个右端点满足条件
  33. if (!flag[j] && (sum[j]&(1LL<<i))==) cnt++;
  34. }
  35. if (cnt >= m && (sum[n]&(1LL<<i))==) { // 如果这一位可以放0。---- 少加了对花括号。。。
  36. for (int j=; j<=n; ++j) // 对所有不可以成为右端点的点打标记
  37. if ((sum[j]&(1LL<<i)) != ) flag[j] = ;
  38. }
  39. else ans |= (1LL << i);
  40. }
  41. cout << ans;
  42. return ;
  43. }

4245: [ONTAK2015]OR-XOR的更多相关文章

  1. BZOJ 4245: [ONTAK2015]OR-XOR

    4245: [ONTAK2015]OR-XOR Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 492  Solved: 269[Submit][Sta ...

  2. 【BZOJ】4245: [ONTAK2015]OR-XOR

    题意 给定一个长度为\(n(1 \le n \le 500000)\)的序列\(a_i(0 \le a_i \le 10^{18})\),将它划分为\(m(1 \le m \le n)\)段连续的区间 ...

  3. BZOJ.4245.[ONTAK2015]OR-XOR(贪心)

    题目链接 从高到低位贪心,判断答案的该位能否为0. 求一个前缀和sum.对于最高位,答案的这一位可以为0当且仅当至少存在m个位置满足sum[i]在这一位上为0. 注意sum[n]这一位必须为0. 如果 ...

  4. bzoj 4245: [ONTAK2015]OR-XOR【按位贪心】

    知道按位贪心但是不知道怎么贪-- 求一个a的异或前缀和s,然后按位从大到小贪心,ans的当前位能为0的条件是s中有>=m个位置这一位为0且没有flag,并且s[n]的这一位为0 如果符合要求,那 ...

  5. BZOJ 4245: [ONTAK2015]OR-XOR 贪心 + 位运算

    Description 给定一个长度为n的序列a[1],a[2],...,a[n],请将它划分为m段连续的区间,设第i段的费用c[i]为该段内所有数字的异或和,则总费用为c[1] or c[2] or ...

  6. 【BZOJ-4245】OR-XOR 按位贪心

    4245: [ONTAK2015]OR-XOR Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 486  Solved: 266[Submit][Sta ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. BZOJ4245 ONTAK2015 OR-XOR 【位运算+贪心】*

    BZOJ4245 ONTAK2015 OR-XOR Description 给定一个长度为n的序列a[1],a[2],…,a[n],请将它划分为m段连续的区间,设第i段的费用c[i]为该段内所有数字的 ...

  9. 【BZOJ4245】[ONTAK2015]OR-XOR 贪心

    [BZOJ4245][ONTAK2015]OR-XOR Description 给定一个长度为n的序列a[1],a[2],...,a[n],请将它划分为m段连续的区间,设第i段的费用c[i]为该段内所 ...

随机推荐

  1. 用python自建一个DNS服务器

    前段日子一直在做公司的DNS调度程序,不过由于性能比较差,方案最终废弃掉了.两个半月心血,不想白白浪费掉,于是改了改,把商业秘密相关的部分去掉,变成了一个公共的DNS服务器.其实说的简单点,就是一个可 ...

  2. ZooKeeper介绍与环境搭建

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...

  3. ResNet 残差网络训练数据

    https://github.com/tornadomeet/ResNet 图片地址: data/trian/cifar10_cifar10.rec data/train/cifar10_val.re ...

  4. [HNOI2007]紧急疏散EVACUATE

    嘟嘟嘟 看数据范围,第一反应觉得爆搜是不是能骗点分,但发现爆搜太难写了,于是就开始想想正解…… 正解大概猜到了是网络流,但是怎么把时间这个条件加入到图的内容中,却困扰了我好半天,总是感觉把这种不同维度 ...

  5. 如何解决“当前上下文中不存在名称“XXXXXXXX””的问题

    如果你是用的Visual Studio 2017,如果你项目中的.cshtml文件出现编译调试一切正常,但是在设计时查看出现下面的提示时: 错误 CS0103 当前上下文中不存在名称“ViewBag” ...

  6. faster-rcnn anchor_target_layer、rpn_proposal_layer、proposal_target_layer

    faster rcnn中这三层是单独生成的层,也是复现最复杂的层 anchor_target_layer作用:从众多的anchor中选取出正负样本供rpn网络学习(实际上就是把anchor和gt进行配 ...

  7. c#类中字段和方法中变量的声明问题

    字段和局部变量的作用域冲突 某些情况下可以区分名称相同,作用域相同的两个标识符.原因是C#在变量之间有一个基本的区分,它把在类级别声明的变量看作 字段,而把在方法中声明的变量看作局部变量. class ...

  8. git忽略文件留存

    ##ignore this file##/target/ .classpath.project.settings /.settings/ ##filter databfile.sln file##*. ...

  9. Vue.js-简单的增删查功能

    1.Vue.js是什么? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图 ...

  10. diogo谈框,仿prompt()方法布局

    展示效果: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...