codeforces 242E(线段树)
来源:互联网 发布:淘宝客网站推广教程 编辑:程序博客网 时间:2024/05/16 14:56
题意:两个操作:1,查询区间和 2.对区间的所有的值进行异或x;
思路:线段数维护一个区间的每一位的1的个数。
#include<bits/stdc++.h>using namespace std;#define clr(x,y) memset(x,y,sizeof x)typedef long long ll;const int maxn = 2e5 + 10;int a[maxn];int add[maxn];struct Node{ Node(){clr(dig,0);} int dig[22];}tree[maxn << 2];void build(int l,int r,int rt){ if(l == r) { for(int i = 0; i < 22;i ++) { if(a[l] & (1 << i))tree[rt].dig[i] ++; } return ; } int mid = (l + r) >> 1; build(l,mid,rt << 1);build(mid + 1,r,rt << 1|1); for(int i = 0; i < 22;i ++) { tree[rt].dig[i] = tree[rt << 1].dig[i] + tree[rt << 1|1].dig[i]; }}void pushdown(int rt,int l,int r){ int mid = (l + r) >> 1; if(add[rt] == 0)return; add[rt << 1] ^= add[rt];add[rt << 1|1] ^= add[rt]; for(int i = 0; i < 22;i ++) { if(add[rt] & (1 << i)) { tree[rt << 1].dig[i] = mid - l + 1 - tree[rt << 1].dig[i]; tree[rt << 1 | 1].dig[i] = r - mid - tree[rt << 1 |1].dig[i]; } } add[rt] = 0;}void update(int L,int R,int x,int l,int r,int rt){ if(L <= l && R >= r) { for(int i = 0;i < 22;i ++) { if(x & (1 << i)) { tree[rt].dig[i] = r - l + 1 - tree[rt].dig[i]; } } add[rt] ^= x; return ; } pushdown(rt,l,r); int mid = (l + r) >> 1; if(L <= mid)update(L,R,x,l,mid,rt << 1); if(R >= mid + 1)update(L,R,x,mid + 1,r,rt << 1|1); for(int i = 0; i < 22;i ++) { tree[rt].dig[i] = tree[rt << 1].dig[i] + tree[rt << 1|1].dig[i]; }}Node query(int L,int R,int l,int r,int rt){ if(L <= l && R >= r) { return tree[rt]; } pushdown(rt,l,r); int mid = (l + r) >> 1; Node t1,t2,t; if(L <= mid)t1 = query(L,R,l,mid,rt << 1); if(R >= mid + 1)t2 = query(L,R,mid + 1,r,rt << 1|1); for(int i = 0;i < 22;i ++) t.dig[i] = t1.dig[i] + t2.dig[i]; return t;}int main(){ // freopen("in.txt","r",stdin); int n; while( ~ scanf("%d",&n)) { clr(add,0); for(int i = 1; i < maxn << 2;i ++)clr(tree[i].dig,0); for(int i = 1;i <= n;i ++)scanf("%d",&a[i]); build(1,n,1); int m;scanf("%d",&m); while(m --) { int type;scanf("%d",&type); if(type == 1) { int l,r;scanf("%d%d",&l,&r); Node t = query(l,r,1,n,1); ll ans = 0; for(int i = 0; i < 22;i ++) ans += (1ll << i) * t.dig[i]; printf("%lld\n",ans); } else { int l,r,x;scanf("%d%d%d",&l,&r,&x); update(l,r,x,1,n,1); } } } return 0;}
阅读全文
0 0
- codeforces 242E(线段树)
- CodeForces - 292E 线段树
- codeforces 400e 线段树
- 线段树 CodeForces 580E
- codeforces 413E 线段树
- CodeForces 242E - XOR on Segment 二维线段树?
- Codeforces 242E. XOR on Segment【线段树】
- CodeForces 242E XOR on Segment 二维线段树
- Codeforces 242E XOR on Segment(线段树)
- Codeforces 242E- XOR on Segment(线段树)
- codeforces 111 160E 线段树
- Codeforces 384E 线段树+dfs序
- 【CodeForces】35E Parade 线段树
- CodeForces 292E Copying Data (线段树)
- codeforces 474E Pillars(线段树+dp)
- Codeforces 474E Pillars dp+线段树
- 线段树 CodeForces 61E 逆序对
- CodeForces 151E Smart Cheater(线段树)
- 每日一练-20171101
- Linux安装ftp组件
- maven eclipse 配置
- —>退役选手----------me
- ip地址服务和库
- codeforces 242E(线段树)
- [BZOJ3124][SDOI2013]直径(DFS)
- CodeForces
- 简单除法和求余
- 大家都知道斐波那契数列现在要求输入一个整数n请你输出斐波那契数列的第n项。例如n<=39
- [EMWIN]不同窗口的ID实验 [待完善]
- 动态规划(DP)-装配线调度问题
- ps画图,光增强立体感
- 从零开始的Jason(一)