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)合并两个线性基,似乎区间异或会炸。 ...
  • wzf_2000
  • wzf_2000
  • 2017年09月27日 08:03
  • 161

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

time limit per test7 seconds memory limit per test256 megabytesDuff is the queen of her country, A...
  • huayunhualuo
  • huayunhualuo
  • 2016年11月11日 22:49
  • 575

codeforces-587A-Duff and Weight Lifting

codeforces-587A-Duff and Weight Lifting
  • loy_184548
  • loy_184548
  • 2015年11月01日 10:49
  • 735

Codeforces 587B Duff in Beach

D. Duff in Beach time limit per test 2 seconds memory limit per test 256 megabytes ...
  • abgnwl
  • abgnwl
  • 2015年10月17日 21:29
  • 737

【codeforces 732E】【贪心 map乱搞】

传送门:http://codeforces.com/contest/732/problem/E 描述: E. Sockets time limit per t...
  • guhaiteng
  • guhaiteng
  • 2016年10月22日 15:32
  • 549

CF 251D Two Sets 异或高斯消元找最优解

CF251D Two Sets 异或高斯消元找最优解
  • YxuanwKeith
  • YxuanwKeith
  • 2016年04月08日 20:46
  • 726

NYOJ587blockhouses

题目大意: 题目
  • u010073953
  • u010073953
  • 2014年04月23日 16:05
  • 378

【codeforces】293E. Close Vertices 点分治+树状数组

传送门:【codeforces】293E. Close Vertices
  • u013368721
  • u013368721
  • 2014年11月07日 20:29
  • 1144

codeforces上一种应对大测试数据debug方法

接触codeforces时间不长,也就参加了10场左右。之前有次比赛就出现了wa了一道题,在比赛结束后看测试数据log时,发现出错的那组用例是个超过一万行输入的情况,codeforces上的测试数据无...
  • qq_29070399
  • qq_29070399
  • 2017年02月03日 16:09
  • 777

关于codeforces比赛规则介绍(转载)

Codeforces 简称: cf(所以谈论cf的时候经常被误会成TX的那款游戏). 网址: codeforces.com   这是一个俄国的算法竞赛网站,由来自萨拉托夫州立大学、由Mike Mirz...
  • y990041769
  • y990041769
  • 2014年02月19日 08:41
  • 15596
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CodeForces 587E Duff as a Queen (线段树+线性基)
举报原因:
原因补充:

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