XOR 游戏

Problem Description
 
众所周知,度度熊喜欢XOR运算[(XOR百科)](http://baike.baidu.com/view/674171.htm)。

今天,它发明了一种XOR新游戏,最开始,它有一个长度为N的数组,度度熊可以任意添加分割线,将数组划分为M段,且每段长度小于等于L。

当然这是个和XOR有关的游戏,度度熊希望所有分组内异或和的最小值最大。

比如,长度为4的数组{1,2,3,4},L为3,可以划分为{1|2,3,4} 或 {1,2|3,4} 或 {1,2,3|4},最小的异或值分别为1,3,0,所以选第二种分割方法。

 
Input
 
第一行为T,表示输入数据组数。

对于每组数据,第一行包含三个整数N,M,L,第二行包含N个数,表示数组。

1≤T≤300

1≤N≤10000,1≤M≤10,1≤L≤N

1≤Ai≤109

 
Output
 
对第i组数据,输出

Case #i:

然后输出一行,仅包含一个整数,表示满足条件分组方法的最小异或值。

 
Sample Input
 
2
4 2 3
1 2 3 4
4 3 2
5 4 3 2
 
Sample Output
 
Case #1:
3
Case #2:
2
 

题解:

  二分答案check mid

  就是在划分m次的情况下 使得当前f[x][i] 表示前i个位置数划分成x快能否使得最小值得最大值大于mid

  维护长度L+1,将这些数的前缀放入trie中,尽量跑出当前能得到的最大值是否大于mid

  代码来自jiry

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<queue>
  7. #include<vector>
  8. using namespace std;
  9. const int N = 1e4+, M = 1e6+, mod = 1e9+, inf = 1e9+;
  10. typedef long long ll;
  11.  
  12. int cas = ,n,m,L,ans,tot,a[N];
  13. int f[][N];
  14. struct ss{
  15. int ls,rs,sz;
  16. }tr[N*];
  17. void ins(int x,int key,int v) {
  18. tr[x].sz += v;
  19. for(int i=;~i;i--) {
  20. if(key&(<<i)) {
  21. if(!tr[x].rs) {
  22. tr[++tot] = (ss) {,,};
  23. tr[x].rs = tot;
  24. }
  25. x = tr[x].rs;
  26. }
  27. else {
  28. if(!tr[x].ls) {
  29. tr[++tot] = (ss) {,,};
  30. tr[x].ls = tot;
  31. }
  32. x = tr[x].ls;
  33. }
  34. tr[x].sz += v;
  35. }
  36. }
  37. int ask(int x,int key) {
  38. int ret = ;
  39. for(int i=;~i;i--) {
  40. if(key&(<<i)) {
  41. if(tr[tr[x].ls].sz)ret += (<<i),x = tr[x].ls;else x = tr[x].rs;
  42. }
  43. else {
  44. if(tr[tr[x].rs].sz) ret += (<<i),x = tr[x].rs;else x = tr[x].ls;
  45. }
  46. }
  47. return ret;
  48. }
  49. int check(int x) {
  50. memset(f,,sizeof(f));
  51. f[][] = ;
  52. for(int j=;j<=m;j++) {
  53. tr[tot = ] = (ss) {,,};
  54. for(int i=;i<=n;i++) {
  55. if(f[j-][i-]) ins(,a[i-],);
  56. if(i>L&&f[j-][i-L-]) ins(,a[i-L-],-);
  57. f[j][i] = (ask(,a[i])>=x);
  58. }
  59. }
  60. return f[m][n];
  61. }
  62. void solve() {
  63. scanf("%d%d%d",&n,&m,&L);
  64. for(int i=;i<=n;i++) scanf("%d",&a[i]), a[i] ^= a[i-];
  65. int l = , r = 2e9+;
  66. while(l<=r) {
  67. int mid = (l+r)>>;
  68. if(check(mid)) l = mid + , ans = mid;
  69. else r = mid - ;
  70. }
  71. printf("Case #%d:\n%d\n",cas++,ans);
  72. }
  73. int main() {
  74. int T;
  75. scanf("%d",&T);
  76. while(T--) {
  77. solve();
  78. }
  79. return ;
  80. }

百度之星复赛 1004 / hdu5715 二分dp+trie的更多相关文章

  1. 2014百度之星资格赛 1004:Labyrinth(DP)

    Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  2. 二分+DP+Trie HDOJ 5715 XOR 游戏

    题目链接 XOR 游戏 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  3. 2014 百度之星 题解 1004 Labyrinth

    Problem Description 度度熊是一仅仅喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫仅仅能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能 ...

  4. hdu5715 XOR 游戏 [2016百度之星复赛D题]

     比赛的时候没仔细想,赛后一想这题其实挺简单的,先求出序列的异或前缀和,然后将异或前缀和建出一颗trie树,然后我们可以二分答案,把问题变成判定性问题,判定是否存在一种方案,使得所有的分组的异或和都大 ...

  5. HDU 6787 Chess 2020百度之星 初赛三 T5 题解 dp

    传送门:HDU 6787 Chess Problem Description 你现在有一个棋盘,上面有 n 个格子,格子从左往右,1,-,n 进行标号.你可以在棋盘上放置恰好 m 个传送器,并且对于每 ...

  6. hdu5713 K个联通块[2016百度之星复赛B题]

    dp 代码 #include<cstdio> ; ; int n,m,k,cnt[N]; ]; ][],i,j,l,a,b; int check(int x,int y) { int i; ...

  7. 2014百度之星第四题Labyrinth(DP)

    Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. 百度之星复赛T6&&hd6149 ——Valley Numer II

    Problem Description 众所周知,度度熊非常喜欢图. 它最近发现了图中也是可以出现 valley —— 山谷的,像下面这张图. 为了形成山谷,首先要将一个图的顶点标记为高点或者低点.标 ...

  9. 百度之星复赛T5&&hdu6148

    Problem Description 众所周知,度度熊非常喜欢数字. 它最近发明了一种新的数字:Valley Number,像山谷一样的数字. 当一个数字,从左到右依次看过去数字没有出现先递增接着递 ...

随机推荐

  1. SpringMvc 相关,bean map转换,百度天气,base64.js,jsBase64.java;

    1. Map<String, Object>与JavaBean[POJO, Model]转换; //model public class model{ private int id; pr ...

  2. glutBitmapCharacter及glBitmap在ATI显卡下无法正常显示的原因初探

    最近家里台式机的老显卡烧了,所以更换了ATI的HD6450显卡,却发现glutBitmapCharacter及glBitmap都无法正常显示字符,nviDIA和intel的显卡则一切正常. 发邮件咨询 ...

  3. WiFi入口流量O2O微应用平台

    WiFi入口流量O2O微应用平台 随着智能手机一年比一年销量大好,传统的互联网的流量争夺战场已经转向了移动互联网,各大巨头纷纷出招,智能wifi路由器就是其中最重要的一块战略高地.所谓的智能路由器,解 ...

  4. 微信公众平台回复过了怎么不能再次回复?亲们要注意查看"公众平台回复用户消息时限变更通知"的公告啊

    有网友一直在问“微信公众平台回复过了怎么不能再次回复?”,其实这个是微信公众平台订阅号设置的一个时间限制,一般都会提示:由于该用户48小时未与你互动,你不能再主动发消息给他.直到用户下次主动发消息给你 ...

  5. 程序员必读:Linux内存管理剖析

    现在的服务器大部分都是运行在Linux上面的,所以作为一个程序员有必要简单地了解一下系统是如何运行的. 对于内存部分需要知道: 地址映射 内存管理的方式 缺页异常 先来看一些基本的知识,在进程看来,内 ...

  6. Hibernate执行原生SQL返回List<Map>类型结果集

    我是学java出身的,web是我主要一块: 在做项目的时候最让人别扭的就是hibernate查询大都是查询出List<T>(T指代对应实体类)类型 如果这时候我用的联合查询,那么返回都就是 ...

  7. 不用任何图片,只用简单的css写出唯美的钟表,就问你行吗?

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAGHCAIAAABJR31QAAAgAElEQVR4nOy9aXhc1ZUurPvcH7f73n ...

  8. Git 怎样保证fork出来的project和原project(上游项目)同步更新

    1.  在 Fork 的代码库中添加上游代码库的 remote 源,该操作只需操作一次即可. 如: 其中# upstream 表示上游代码库名, 可以任意. git remote add upstre ...

  9. Rotate List

    Given a list, rotate the list to the right by k places, where k is non-negative. Example Given 1-> ...

  10. 22.整数二进制表示中1的个数[Get1BitCount]

    [题目] 输入一个整数,求该整数的二进制表达中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. [分析] 如果一个整数不为0,那么这个整数至少有一位是1.如果我们把这个整数 ...