题目链接

XOR 游戏

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 256    Accepted Submission(s): 86

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

Source
2016"百度之星" - 复赛(Astar Round3)

题解:二分答案,dp[n][m]判断n个数字分成m段的可行性,那么每一段的异或和不小于mid,先处理出前缀异或和,生成m棵trie树,表示保存了dp[i][j]保存的最后的前缀异或和的位置.那么转移的话,就是满足max (A[j] ^ A[i] = (a[j+1] ^ a[j+2] ^ ... ^ a[i])) <= mid,求最大值就是trie里搜异或和最大,首先要求j到i的距离小于L.

#include <bits/stdc++.h>

const int N = 1e4 + 5;
struct Trie {
static const int NODE = N * 32;
int ch[NODE][2], cnt[NODE];
int sz;
void init() {
ch[0][0] = ch[0][1] = 0;
sz = 1;
}
void insert(int x) {
int u = 0;
for (int c, i=29; i>=0; --i) {
c = (x >> i) & 1;
if (!ch[u][c]) {
ch[sz][0] = ch[sz][1] = 0;
cnt[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];
cnt[u]++;
}
}
void _delete(int x) {
int u = 0;
for (int c, i=29; i>=0; --i) {
c = (x >> i) & 1;
int tu = u;
u = ch[u][c];
cnt[u]--;
if (!cnt[u]) {
ch[tu][c] = 0;
return ;
}
}
}
int query(int x) {
int ret = 0, u = 0;
for (int c, i=29; i>=0; --i) {
c = (x >> i) & 1;
if (ch[u][c^1]) {
ret += (1 << i);
u = ch[u][c^1];
} else {
u = ch[u][c];
}
}
return ret;
}
}trie[11];
int a[N];
bool dp[N][11];
int n, m, k; bool check(int val) {
for (int i=0; i<=m; ++i) {
trie[i].init ();
}
for (int i=0; i<=n; ++i) {
for (int j=0; j<=m; ++j) {
dp[i][j] = false;
}
}
dp[0][0] = true;
trie[0].insert (0);
for (int i=1; i<=n; ++i) {
for (int j=1; j<=m; ++j) {
if (i > k && dp[i-k-1][j-1]) {
trie[j-1]._delete (a[i-k-1]);
}
if (trie[j-1].query (a[i]) >= val) {
dp[i][j] = true;
trie[j].insert (a[i]);
}
}
}
return dp[n][m];
} int solve() {
scanf ("%d%d%d", &n, &m, &k);
for (int i=1; i<=n; ++i) {
scanf ("%d", a+i);
}
a[0] = 0;
for (int i=1; i<=n; ++i) {
a[i] = a[i-1] ^ a[i];
}
int left = 0, right = 1e9 + 7, ret = 0;
while (left <= right) {
int mid = left + right >> 1;
if (check (mid)) {
ret = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
return ret;
} int main() {
int T;
scanf ("%d", &T);
for (int cas=1; cas<=T; ++cas) {
printf ("Case #%d:\n%d\n", cas, solve ());
}
return 0;
}

二分+DP+Trie HDOJ 5715 XOR 游戏的更多相关文章

  1. HDU 5715 XOR 游戏 二分+字典树

    XOR 游戏 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5715 Description 众所周知,度度熊喜欢XOR运算(XOR百科). 今天,它 ...

  2. 百度之星复赛 1004 / hdu5715 二分dp+trie

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

  3. 二分+DP HDU 3433 A Task Process

    HDU 3433 A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  4. hdu 3433 A Task Process 二分+dp

    A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  5. 2018.10.24 NOIP模拟 小 C 的数组(二分+dp)

    传送门 考试自己yyyyyy的乱搞的没过大样例二分+dp二分+dp二分+dp过了606060把我自己都吓到了! 这么说来乱搞跟被卡常的正解比只少101010分? 那我考场不打其他暴力想正解血亏啊. 正 ...

  6. 「学习笔记」wqs二分/dp凸优化

    [学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...

  7. 【bzoj1044】[HAOI2008]木棍分割 二分+dp

    题目描述 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且 ...

  8. Luogu P2511 [HAOI2008]木棍分割 二分+DP

    思路:二分+DP 提交:3次 错因:二分写萎了,$cnt$记录段数但没有初始化成$1$,$m$切的次数没有$+1$ 思路: 先二分答案,不提: 然后有个很$naive$的$DP$: 设$f[i][j] ...

  9. Leetcode之动态规划(DP)专题-877. 石子游戏(Stone Game)

    Leetcode之动态规划(DP)专题-877. 石子游戏(Stone Game) 亚历克斯和李用几堆石子在做游戏.偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] . 游戏以谁手中的石子最 ...

随机推荐

  1. ASP.NET知识总结 (未完) 本人新手

    1:HTTP的工作方式是什么?1)客户端提交表单请求处理 Request2)服务器端处理程序进行处理 Handle3)服务端相应 Response 2:1)get(默认值)是通过地址栏的URL显式地传 ...

  2. vs2015全新nuget使用全析

    随着vs2015正式版本的发布,实在按捺不住,安装体验了一把,感触最大的除了可以调试lamda以外莫过于对nuget的升级. 先来一张全景: 怎么样,风格完全不同了吧.可以显示预发行版本了,右上角那个 ...

  3. Sicily 1031: Campus (最短路)

    这是一道典型的最短路问题,直接用Dijkstra算法便可求解,主要是需要考虑输入的点是不是在已给出的地图中,具体看代码 #include<bits/stdc++.h> #define MA ...

  4. Eclipse 各版本版本号代号对应一览表

    版本号 代号 日期   Eclipse 3.1 IO [木卫一,伊奥] 2005   Eclipse 3.2 Callisto [木卫四,卡里斯托] 2006   Eclipse 3.3 Eruopa ...

  5. SWFUpload多图上传、C#后端跨域传文件带参数

    前几天工作中用到了SWFUpload上传图片,涉及到跨域,因为前端无法实现跨域,所以只能把文件传到后端进行跨域请求,整理分享下. 效果图 前端 html部分 <!DOCTYPE html> ...

  6. 函数find(exp)

    Matlab函数find(exp): 查找符合exp的值并储存 示例: b=find(a>20&a<40) 仅此

  7. [MySQL]show index from tb_name命令各列的含义

    show index from table_name 这个命令有助于诊断性能低下的查询,尤其是查询是否使用了可用的索引. 下面介绍下 这个命令显示的结果列的含义: | Table | Non_uniq ...

  8. 我的CPG插件 (什么是CPG,就是跟号称全球唯一C++编写的魔镜是一样的格式的)

  9. 使用vue1.0+es6+vue-cli+webpack+iview-ui+jQuery 撸一套高质量的后台管理系统

    首先按照vue.js官网的指令安装: 1.本地安装好node.js 2.根据官方命令行工具 详情 这样一个官方的脚手架工具就已经搭建好了:但是有一点需要注意的是由于现在按照官方的搭建方法是搭建vue2 ...

  10. 响应者链条,如何获取最佳的点击view 以及内部实现

    事件的产生与传递 事件是如何产生与传递的? 当发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中. UIApplication会从时间队列中取出最前面的时间,并将事件 ...