CodeForces 587E Duff as a Queen (线段树+线性基)

原创 2016年06月01日 21:46:51
#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <deque>
#include <map>
#include <bitset>
#include <queue>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;

#define LL long long
#define ULL unsigned long long
#define eps 1e-9
#define N 200020
#define M 100010
#define pii pair<int,int>
#define MP make_pair
#define inf 0x3f3f3f3f
#define md (ll+rr>>1)
#define lson ll, md, ls
#define rson md + 1, rr, rs
#define ls (i << 1)
#define rs (ls | 1)
#define mod 1000000007
#define Pi acos(-1.0)


struct node {
	int a[30];
	void clear() {
		memset(a, 0, sizeof a);
	}
	int count() {
		int ret = 0;
		for(int i = 0; i <= 29; ++i) ret += a[i] > 0;
		return ret;
	}
	void add(int x) {
		for(int i = 0; i <= 29; ++i) {
			if(x >> i & 1) {
				if(a[i]) x ^= a[i];
				else {
					a[i] = x;
					break;
				}
			}
		}
	}
};


node s[N << 2];
int add[N << 2], val[N << 2], b[N << 2];
int n, q;

void push_up(int i) {
	s[i].clear();
	for(int j = 0; j <= 29; ++j) s[i].add(s[ls].a[j]);
	for(int j = 0; j <= 29; ++j) s[i].add(s[rs].a[j]);
}
void build(int ll, int rr, int i) {
	if(ll == rr) {
		scanf("%d", &val[ll]);
		s[i].clear();
		b[i] = val[ll] ^ val[ll - 1];
		s[i].add(b[i]);
		return;
	}
	build(lson);
	build(rson);
	push_up(i);
}

void update1(int x, int v, int ll, int rr, int i) {
	if(ll == rr) {
		s[i].clear();
		b[i] ^= v;
		s[i].add(b[i]);
		return;
	}
	if(x <= md) update1(x, v, lson);
	else update1(x, v, rson);
	push_up(i);
}

void update2(int l, int r, int v, int ll, int rr, int i) {
	if(ll == l && rr == r) {
		add[i] ^= v;
		return;
	}
	if(r <= md) update2(l, r, v, lson);
	else if(l > md) update2(l, r, v, rson);
	else {
		update2(l, md, v, lson);
		update2(md + 1, r, v, rson);
	}
}

node query1(int l, int r, int ll, int rr, int i) {
	if(ll == l && rr == r) return s[i];
	if(r <= md) return query1(l, r, lson);
	if(l > md) return query1(l, r, rson);
	node x = query1(l, md, lson);
	node y = query1(md + 1, r, rson);
	for(int j = 0; j <= 29; ++j) x.add(y.a[j]);
	return x;
}
int query2(int x, int ll, int rr, int i) {
	int ret = add[i];
	if(ll == rr) {
		return val[ll] ^ ret;
	}
	if(x <= md) ret ^= query2(x, lson);
	else ret ^= query2(x, rson);
	return ret;
}


		


int main() {
	scanf("%d%d", &n, &q);
	build(1, n, 1);

	while(q--) {
		int op, l, r, v;
		scanf("%d%d%d", &op, &l, &r);
		if(op == 1) scanf("%d", &v);

		if(op == 1) {
			update1(l, v, 1, n, 1);
			if(r != n) update1(r + 1, v, 1, n, 1);
			update2(l, r, v, 1, n, 1);
		}
		else {
			node ans;
			ans.clear();
			if(l != r) ans = query1(l + 1, r, 1, n, 1);
			int x = query2(l, 1, n, 1);
			ans.add(x);
			printf("%d\n", 1 << ans.count());
		}
	}
	return 0;
}

相关文章推荐

【Codeforces587E】Duff as a Queen

题意: 区间异或一个数,区间询问能异或出几个数。线性基应该有个性质,里面有nn个数,就可以异或出2n2^n个数。 然后如果暴力O(log2n)O(log^2n)合并两个线性基,似乎区间异或会炸。 ...

【codefores 587 E】Duff as a Queen——线段树+线性基

time limit per test7 seconds memory limit per test256 megabytesDuff is the queen of her country, A...

codeforces 676E 数学多项式

外国人写的太神看不懂,网上题解随机数这种乱搞都出来了,然后无奈自己推该方法前面证明是对的然后会超long long所以不断改变mod水过,太菜真心想不到更好的方法。 证明: 一个多项式分解成 (x...

Codeforces 837E Vasya's Function:数论入门初步

题意:定义F(a,0) = 0,F(a,b) = 1 + F(a,b - GCD(a,b)。给定 x 和 y ( 题解:a=A*GCD(a,b) b=B*GCD(a,b),那么b-GCD(a,b) ...

codeforces 587F. Duff is Mad

蛮好的一道fail树的题目 考虑fail树,对于询问l,r,k,相当于询问l~r的字符串在AC自动机上对应节点在fail树子树中是第k个串前缀的节点的个数和。 发现k固定有一种O(n+Σ串长)的优秀做...
  • Miao_zc
  • Miao_zc
  • 2017年06月09日 10:42
  • 166

[二分答案 2-SAT验证 前后缀优化建图] Codeforces 587D #326 (Div. 1) D. Duff in Mafia

大概题意是删去一组边 这组边是一个匹配 剩下的边 同一颜色的一组边也形成一个匹配 使删去的边最大值最小 这个考虑二分答案 然后检验 大于答案的边必然保留 同一个点连的同一颜色的边最多保留一条 同...

codeforces587B Duff in Beach

题意就是两个数组A,B其中B[i] = A[i%n],B有l个元素,A有n个元素。 从B中选取x个元素,相邻元素在B中的下标满足Ij/n + 1 == I[j+1]/n。 可以用dp[i][j]表...

Codeforces 587C Duff in the Army

题意:给出一棵树,每个节点有一个权值集合(一个点有多个值),现在有q个询问,query(u,v,a)表示询问u到v之间的前a小的数。 与 http://blog.csdn.net/mr_xujh/a...
  • Mr_Xujh
  • Mr_Xujh
  • 2015年10月26日 11:57
  • 461

codeforces-587A-Duff and Weight Lifting

codeforces-587A-Duff and Weight Lifting

Codeforces Round #326 (Div. 2)587A. Duff and Weight Lifting

解题报告:Codeforces Round #326 (Editorial) A. Duff and Weight Lifting time limit per test 1 seco...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CodeForces 587E Duff as a Queen (线段树+线性基)
举报原因:
原因补充:

(最多只允许输入30个字)