题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5661

题意:

  给你一个长度为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⊕a,  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 (暴力+二项式)的更多相关文章

  1. 【二项式定理】【DFS】UVALive - 7639 - Extreme XOR Sum

    题意:一个序列,q次询问,每次问你某个指定区间内的EXtreme XOR值. 一个长度为l的区间的EXtreme XOR值被定义为,从左到右,将每相邻的两个数XOR起来,产生l-1个新的值,……如此循 ...

  2. UVALive - 7639 G - Extreme XOR Sum(思维)

    题目链接 题意 给出一个序列,相邻两两异或,生成一个新序列,再相邻两两异或,直到只剩下一个元素,问最后结果为多少.m个查询,每次都有一个待查询区间. 分析 既然有多组查询,n只是1e4,那么可以考虑预 ...

  3. 字典树-百度之星-Xor Sum

    Xor Sum Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheu ...

  4. UVA 11426 - GCD - Extreme (II) (数论)

    UVA 11426 - GCD - Extreme (II) 题目链接 题意:给定N.求∑i<=ni=1∑j<nj=1gcd(i,j)的值. 思路:lrj白书上的例题,设f(n) = gc ...

  5. 2014 百度之星 1003 题解 Xor Sum

    Xor Sum Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包括了N个正整数,随后 Prometheu ...

  6. HDU 4825 Xor Sum(经典01字典树+贪心)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

  7. HDU 4825 Xor Sum 字典树+位运算

    点击打开链接 Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) ...

  8. 2014百度之星第三题Xor Sum(字典树+异或运算)

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others) Total ...

  9. Xor Sum 01字典树 hdu4825

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Total S ...

随机推荐

  1. 树形dp相关

    前言 1:与树或图的生成树相关的动态规划. 2:以每棵子树为子结构,在父亲节点合并,注意树具有天然的子结构.这是很优美的很利于dp的. 3:巧妙利用Bfs或Dfs序,可以优化问题,或得到好的解决方法. ...

  2. 题解 CF292A 【SMSC】

    蒟蒻本想发一篇黑题题解,没想到黑题竟然掉紫了QwQ. 趁着题解还只有几篇,赶紧来发一篇嘿嘿嘿. 这道题其实很简单,题解其实都不需要 AC代码: #include<bits/stdc++.h> ...

  3. Python 里面如何生成随机数?

    在 Python 中用于生成随机数的模块是 random,在使用前需要 import. 如下例子可以酌情列举: random.random():生成一个 0-1 之间的随机浮点数: random.un ...

  4. thinkphp5发送邮件(实例代码 非常适合新手)

    第一步:在(https://pan.baidu.com/s/1Fq6lONHlft5D6jvOnNwtoA)下载 phpmailer.rar 解压 然后把文件放入 vendor目录下 第二步:在 ap ...

  5. vue项目1-pizza点餐系统5-全局守卫

    一.导航守卫描述 当问我们点击主页.菜单等非登陆和注册按钮都会提示先登陆然后跳转到登陆界面. 1.在main.js中引入全局守卫 //全局守卫 //to是要进入那个路由,from是从那个路由出来,ne ...

  6. lilybbs-faq - linux入门以及百合 Linux 版精华区导读

    QUESTIONS 问题与解答 不需要任何命令的简单介绍 历史 (APUE 提到了1990年之前的unix历史,还有各种标准 ANSI ISO IEEE posix xpg3.... 但是linux ...

  7. Taro -- 文字左右滚动公告效果

    文字左右滚动公告效果 设置公告的左移距离,不断减小,当左移距离大于公告长度(即公告已移出屏幕),重新循环. <View className='scroll-wrap'> <View ...

  8. STM32 总线

    AHB,是Advanced High performance Bus的缩写,译作高级高性能总线,这是一种“系统总线”.AHB主要用于高性能模块(如CPU.DMA和DSP等)之间的连接.AHB 系统由主 ...

  9. mock.js模拟ajax数据请求

    在我们开发过程中存在着前端页面ui完成了,但是没有接口进行联调数据的情况,现在介绍一下用mock.js来完成数据的请求.这样在后期我们的后台接口完成后只需要更改请求的接口名字即可!前提是你的模拟字段名 ...

  10. evpp::buffer使用

    evpp::Buffer testmsg; const char* buf123 = "12342333333333333333333333333323424324234234"; ...