codeforces 617E 莫队入门
来源:互联网 发布:马伯乐了知 编辑:程序博客网 时间:2024/06/05 00:22
莫队算法就是现将上所有的点分成sqrt(n)块,然后将要查询的区间离线起来,然后进行对[L,R]变到[L - 1,R] 、或者[L + 1,R],[L,R - 1],[L,R + 1]进行O(1)的变换。
莫队算法是优雅的暴力,复杂度O(nlogn)。
题意:给出一个一个数列,然后查询在给出区间的异或值等于k的子区间的个数。
思路:先对区间进行去前缀和处理,然后区间[L,R]的异或值为sum[R] ^sum[L - 1];然后剩下来的就是进行L,R的转移了。
#include<bits/stdc++.h>using namespace std;#define clr(x,y) memset(x,y,sizeof x)typedef long long ll;const int maxn = 2e6 + 10;int a[maxn],pos[maxn],sum[maxn];ll num[maxn];struct Node{int L,R,id;}q[maxn];bool cmp(Node p1,Node p2){ return pos[p1.L] == pos[p2.L] ? p1.R < p2.R : pos[p1.L] < pos[p2.L];}ll Ans;int n,m,k;void add(int x){ Ans += num[sum[x]^k]; num[sum[x]] ++;}void del(int x){ num[sum[x]] --; Ans -= num[sum[x]^k];}ll ans[maxn];int main(){ // freopen("in.txt","r",stdin); while( ~ scanf("%d%d%d",&n,&m,&k)) { clr(num,0);sum[0] = 0;num[0] = 1; int ss = sqrt(n); for(int i = 1;i <= n;i ++)scanf("%d",&a[i]),pos[i] = i / ss,sum[i] = sum[i - 1] ^ a[i]; for(int i = 1; i <= m;i ++)scanf("%d%d",&q[i].L,&q[i].R),q[i].id = i; sort(q + 1,q + m + 1,cmp); int l = 1,r = 0; Ans = 0; for(int i = 1;i <= m;i ++) { while(l > q[i].L) { l --; add(l - 1); } while(l < q[i].L) { del(l - 1); l ++; } while(r > q[i].R) { del(r --); } while(r < q[i].R) { add(++ r); } ans[q[i].id] = Ans; } for(int i = 1;i <= m;i ++) { printf("%lld\n",ans[i]); } } return 0;}
阅读全文
0 0
- codeforces 617E 莫队入门
- 莫队算法入门 + 模板 Codeforces 617E
- codeforces 617E (莫队算法)
- codeforces 617E 莫队算法
- 【莫队算法】codeforces 617e
- Codeforces 617E:XOR and Favorite Number 莫队算法
- Codeforces 617E ( 莫队算法 Mo's algorithm )
- Codeforces 617E XOR and Favorite Number[莫队算法]
- codeforces 813e 莫队算法
- codeforces 617e
- codeforces 617E (莫队)
- 【莫队算法】[CodeForces - 617E/Round #340]XOR and Favorite Number
- codeforces 617E XOR and Favorite Number (莫队算法)
- Codeforces 617E XOR and Favorite Number (区间异或和 莫队算法 分块暴力)
- Codeforces Round #340 (Div. 2) 617E XOR and Favorite Number 莫队算法
- Codeforces-617E-XOR and Favorite Number(莫队算法)
- Codeforces Round #340 (Div. 2) E题 莫队算法
- Codeforces Round #340 (Div. 2). E 莫队算法
- 接口的回调与回调机制
- 表达式计算
- Java消息中间件
- echats3.7样式问题
- 自己动手搭建GitLab
- codeforces 617E 莫队入门
- LeetCode#718 Maximum Length of Repeated Subarray (week9)
- 提示框
- LeetCode 410: Split Array Largest Sum 解题与思考
- CNN和RNN在自然语言中的适用场景
- 面向对象的设计原则
- 建立统一标准的教育大数据
- 013-SDK框架之LYWSDKPlatformManager.mm
- Java基础知识-Map