CF 617E 莫队
CF 617E
题目链接:
http://codeforces.com/problemset/problem/617/E
题意:
问[L,R]区间内,有多少个子区间,它们里元素的异或和为k。
思路:
莫队算法。
发现自己对于这个算法理解还是不到位。主要是下标问题。如本题,处理完pre数组后,pre数组表示XOR(a[1]^a[2]…a[i]),所以更新的时候更新左区间需要更新pre[i-1],当然这是看了别人代码才知道的。
源码:
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
#define LL long long
const int MAXN = 100000 + 5;
int pos[MAXN], blocksize;
struct Q
{int l, r;int id;
}q[MAXN * 10];
bool cmp(Q a, Q b){if(pos[a.l] == pos[b.l]) return a.r < b.r; return a.l < b.l;}
LL res[MAXN * 10];
int a[MAXN], pre[MAXN];
LL cnt[MAXN * 40];
int n, m, k;
void update(int u, int v, LL &ans)
{
// printf("v = %d\n", v);
// printf("ans1 = %I64d, ", ans);if(v == 1){ans += cnt[k^u];cnt[u]++;}else{cnt[u]--;ans -= cnt[k^u];}
// printf("u = %d\n", u);
// for(int i = 0 ; i <= 1 ; i++) printf("%I64d ", cnt[i]);
// printf("\n");
// printf("ans2 = %I64d, cnt[%d] = %I64d, cnt[%d] = %I64d\n", ans, u, cnt[u], u ^ k, cnt[u ^ k]);
// system("pause");
}
int main()
{while(scanf("%d%d%d", &n, &m, &k) != EOF){blocksize = sqrt(1.0 * n);for(int i = 1 ; i <= n ; i++){scanf("%d", &a[i]);pre[i] = pre[i - 1] ^ a[i];pos[i] = (i - 1) / blocksize;}memset(cnt, 0, sizeof(cnt));cnt[0] = 1;for(int i = 0 ; i < m ; i++)scanf("%d%d", &q[i].l, &q[i].r), q[i].id = i;sort(q, q + m, cmp);int curr = 0, curl = 1;LL ans = 0;for(int i = 0 ; i < m ; i++){for(int j = curr + 1; j <= q[i].r ; j++) update(pre[j], 1, ans);
// printf("ans = %I64d\n", ans);for(int j = curr; j > q[i].r ; j--) update(pre[j], -1, ans);
// printf("ans = %I64d\n", ans);for(int j = curl ; j < q[i].l ; j++) update(pre[j - 1], -1, ans);
// printf("ans = %I64d\n", ans);for(int j = curl - 1 ; j >= q[i].l ; j--) update(pre[j - 1], 1, ans);
// printf("ans = %I64d\n", ans);curl = q[i].l, curr = q[i].r;
// printf("i = %d, cur = %d, r = %d, ans = %I64d, q[i].id = %d\n", i, q[i].l, q[i].r, ans, q[i].id);res[q[i].id] = ans;
// for(int j = 0 ; j <= 1 ; j++) printf("%I64d ", cnt[j]); printf("\n");
// system("pause");}for(int i = 0 ; i < m ; i++) printf("%I64d\n", res[i]);}return 0;
}
CF 617E 莫队相关推荐
- 【打CF,学算法——四星级】CodeForces 86D Powerful array (莫队算法)
[CF简介] 题目链接:CF 86D 题面: D. Powerful array time limit per test 5 seconds memory limit per test 256 meg ...
- 莫队 ---- CF 135D. Jeff and Removing Periods (等差数列预处理 + 莫队)
题目 题目大意: 给你一个等差序列,每次查询一段区间[l,r][l,r][l,r]的答案. 显然这是典型的不带修改的区间询问类问题,我们可以考虑用莫队算法去解决. 解题思路: 接下来看怎么递推[l,r ...
- cf D. Powerful array 莫队算法
D. Powerful array 题意:给定一个序列>>每次查询一个区间>>查询该区间内 出现过的数字*出现的次数的平方 的和 思路:学习莫队的第一题或者说小z的袜子是第一题 ...
- CodeForces - 617E XOR and Favorite Number(莫队)
题目链接:点击查看 题目大意:给出一个由n个数组成的数列,现在给出m组询问,每次询问包含一个l和一个r,要求回答在闭区间[l,r]中有多少组(i,j)满足[i,j]闭区间内的所有数的异或和等于k 题目 ...
- CodeForces - 617E XOR and Favorite Number (莫队+前缀和)
Bob has a favorite number k and ai of length n. Now he asks you to answer m queries. Each query is g ...
- codeforces 617E XOR and Favorite Number 莫队
https://vjudge.net/problem/CodeForces-617E 题目大意:给nnn个数,mmm个询问,以及一个数kkk,每次询问要输出[l,r][l,r][l,r]内满足a[i] ...
- CodeForces -617E XOR and Favorite Number(莫队)
题目链接:点击这里 题目大意: 给定一个长度为 nnn 的序列 a1,a2,...,ana_1,a_2,...,a_na1,a2,...,an ,再给出一个数字 kkk , mmm 组询问每组询 ...
- 【CF 617E】 XOR and Favorite Number (Mo's algorithm)
[CF 617E] XOR and Favorite Number (Mo's algorithm) E. XOR and Favorite Number time limit per test 4 ...
- CodeForces 86 D Powerful array 莫队
Powerful array 题意:求区间[l, r] 内的数的出现次数的平方 * 该数字. 题解:莫队离线操作, 然后加减位置的时候直接修改答案就好了. 这个题目中发现了一个很神奇的事情,本来数组开 ...
最新文章
- C语言中缺少link文件,如何在link文件中给某个C文件的bss分配单独的段?
- 数据挖掘与机器学习介绍
- linux wine 中文乱码,Linux下使用Wine出现中文乱码的解决方法
- 软考计算机网络原理之IP计算问题汇总
- 仿百度文库方案[openoffice.org 3+swftools+flexpaper](八) 之 常见问题集FAQ
- P4552-[Poetize6]IncDec Sequence【差分】
- Linux下添加服务
- C++ shared_ptr make_shared是什么意思
- 教室录播系统方案_学校教室录播系统解决方案
- 大数据查询平台有哪些?Hadoop数据查询组件分析
- 20220520数据结构绿皮书读书笔记
- 在中关村创业大街Binggo这半年
- 雷电模拟器修改本地IP
- 【期货交易】期货持仓量浅析,持仓是什么?
- vue3.0+vite+ts使用swiper如何掉用autoplay
- AI 边缘计算平台 - BeagleBone AI 64 简介
- 第06篇 部署区块链浏览器(1)
- 先有史记还是先有资治通鉴?司马迁、司马光和司马懿三人什么关系?
- mongodb查询文档
- 2020 年编程语言盘点展望:Java 老兵不死,Kotlin 蓄势待发