uva live 7639 Extreme XOR Sum (暴力+二项式)
题意:
给你一个长度为n的整数序列,询问任意区间的极端异或和。
定义极端异或和:
当长度n > 1 的时候,将数组长度缩小到n-1。
[a1, a2, a3 ···, an] -> [a1⊕a2, a2⊕a3, a3⊕a4, ···, an-1⊕an]。
一直缩小,直到长度减为1, 就是极端异或和。
题解:
[a1, a2, a3, a4, a5] 操作时
第一次:[a1⊕a2, a2⊕a3, a3⊕a4, a4⊕a5]
第二次:[a1⊕a2⊕a2⊕a3 , a2⊕a3⊕a3⊕a4, a3⊕a4⊕a4⊕a5]
以此类推到最后我们发现 a1用了1次, a2用了4次, a3用了6次, a4用了4次, a5用了1次。
1 4 6 4 1。这个正好是C(0,4) C(1,4) C(2,4) C(3,4) C(4,4)。
满足二项式的系数。
所以对于长度为n的时候,我们需要C(n-1)的系数。
我们就可以预处理C数组。
memset(C, );
for(int i = ;i<=n;i++){
C[i][] = ;
for(int j = ;j<=i;j++) C[i][j] = C[i-][j-] + C[i-][j];
}
因为只需要考虑奇偶性,就可以 C[i][j] = (C[i-1][j-1] + C[i-1][j])%2
在第i个位置判断为奇数的时候就异或一下就可以得到ans了。
但是一次询问O(n) 的复杂度,会导致TLE。就需要优化一下。
我们可以发现 %2 的操作其实就 xor的操作。
int C[maxn];
vector <int> pos[maxn];
void init()
{
ms(C, );
for(int i = ;i<maxn;i++)
{
C[] = C[i-] = ;
for(int j = i-;j>=;j--) C[j] = C[j-]^C[j];
for(int j = ;j<i;j++)
if(C[j])
pos[i].pb(j);
}
}
这里减少了一维的空间(可以参考01背包那里),因为都是滚动数组。
将第j个位置是奇数,记录起来。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#include <set>
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
#define ms(a, b) memset(a, b, sizeof(a))
#define pb push_back
#define mp make_pair
#define eps 0.0000000001
#define IOS ios::sync_with_stdio(0);cin.tie(0);
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int inf = 0x3f3f3f3f;
const int mod = 1e9+;
const int maxn = +;
int a[maxn];
int C[maxn];
vector <int> pos[maxn];
void init()
{
ms(C, );
for(int i = ;i<maxn;i++)
{
C[] = C[i-] = ;
for(int j = i-;j>=;j--) C[j] = C[j-]^C[j];
for(int j = ;j<i;j++)
if(C[j])
pos[i].pb(j);
}
}
void solve()
{
int n;scanf("%d", &n);
for(int i = ;i<n;i++) scanf("%d", &a[i]);
int q;scanf("%d", &q);
while(q--){
int l, r;scanf("%d%d", &l, &r);
int len = r-l+;
int ans = ;
int sz = pos[len].size();
for(int k = ;k<sz;k++){
ans ^= a[pos[len][k]+l];
}
printf("%d\n", ans);
}
}
int main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
// IOS
init();
int t;scanf("%d", &t);
int cnt = ;
while(t--){
printf("Case %d:\n", cnt++);
solve();
}
return ;
}
还有一个用Sierpinski sieve优化的,附上链接:http://morris821028.github.io/categories/%E8%A7%A3%E9%A1%8C%E5%8D%80/%E8%A7%A3%E9%A1%8C%E5%8D%80-UVa/
uva live 7639 Extreme XOR Sum (暴力+二项式)的更多相关文章
- 【二项式定理】【DFS】UVALive - 7639 - Extreme XOR Sum
题意:一个序列,q次询问,每次问你某个指定区间内的EXtreme XOR值. 一个长度为l的区间的EXtreme XOR值被定义为,从左到右,将每相邻的两个数XOR起来,产生l-1个新的值,……如此循 ...
- UVALive - 7639 G - Extreme XOR Sum(思维)
题目链接 题意 给出一个序列,相邻两两异或,生成一个新序列,再相邻两两异或,直到只剩下一个元素,问最后结果为多少.m个查询,每次都有一个待查询区间. 分析 既然有多组查询,n只是1e4,那么可以考虑预 ...
- 字典树-百度之星-Xor Sum
Xor Sum Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheu ...
- UVA 11426 - GCD - Extreme (II) (数论)
UVA 11426 - GCD - Extreme (II) 题目链接 题意:给定N.求∑i<=ni=1∑j<nj=1gcd(i,j)的值. 思路:lrj白书上的例题,设f(n) = gc ...
- 2014 百度之星 1003 题解 Xor Sum
Xor Sum Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheu ...
- HDU 4825 Xor Sum(经典01字典树+贪心)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total ...
- HDU 4825 Xor Sum 字典树+位运算
点击打开链接 Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) ...
- 2014百度之星第三题Xor Sum(字典树+异或运算)
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Total ...
- Xor Sum 01字典树 hdu4825
Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)Total S ...
随机推荐
- 开篇——从程序员到IT经理
2002年~2005年我在广州的广东水力电力职业技术学院求学,主修网络工程.求学期间,我从事最多的就是玩游戏,当时就是玩MU和CS,所以有一门编程课叫C语言的“肥佬”(广东话)了,要补考,没办法,于是 ...
- Javascript原型介绍
原型及原型链 原型基础概念 function Person () { this.name = 'John'; } var person = new Person(); Person.prototype ...
- .Net Core - 使用Supervisor进行托管部署
环境 CentOS 7 x64,详见 安装CentOS7虚拟机 .Net Core 2.1.801 详见 CentOS 7 下安装.NET Core SDK 2.1 ftp 详见 CentOS7 ...
- java不能卸载,提醒路劲找不到 *:\Java\
安装MyEclipse是提醒找不到java安装路劲 :*:\Java\jdk1.7.0_80 想卸载java重装也没法卸载,还是同样的提醒 找不到java安装路劲 :*:\Java\jdk1.7.0_ ...
- java学习day1
一.常用的DOS命令 1.打开cmd 窗口键+r --> 输入cmd --> 确认 2.常用的dos命令 dir:列出当前目录下的所有文件及文件夹 md:创建一个新的目录 rd:删除目录 ...
- 【模板】最长上升子序列(LIS)及其优化 & 洛谷 AT2827 LIS
最长上升子序列 传送门 题意 对于给定的一个n个数的序列,找到它的一个最长的子序列,并且保证这个子序列是由低到高排序的. 例如,1 6 2 5 4 6 8的最长上升子序列为1 2 4 6 8. 基本思 ...
- j网络爬虫之WebMagic
WebMagic官网:http://webmagic.io/ 注意: 1.在自定义PageProcessor中使用System.out.println(“str”),Spider.create(new ...
- 7.css3表格、列表、边框的样式设置--list/border
1.css表格: ①Border-collapse是否把表格边框合并为单一的边框.Separate默认值,collapse合并. ②Border-spacing分割单元格边框的距离. ③Caption ...
- JavaEE高级-Struts2学习笔记
Struts2是一个用来来发MVC应用的框架,它提供了Web应用程序开发过程中一些常见问题的解决方案: - 对来自用户的输入数据进行合法的验证 - 统一的布局 - 可扩展性. - 国际化和本地化 - ...
- Codeforces Round #426 (Div. 2) - D
题目链接:http://codeforces.com/contest/834/problem/D 题意:给定一个长度为n的序列和一个k,现在让你把这个序列分成刚好k段,并且k段的贡献之和最大.对于每一 ...