【BZOJ2819】Nim

10人阅读 评论(0) 收藏 举报
分类:

【题目链接】

【思路要点】

  • 补档博客,无题解。

【代码】

#include<bits/stdc++.h>
using namespace std;
#define MAXN	500005
#define MAXLOG	20
struct Binary_Index_Tree {
	int value[MAXN], n;
	void modify(int x, int y, int v) {
		for (int i = x; i <= n; i += i & -i)
			value[i] ^= v;
		for (int i = y + 1; i <= n; i += i & -i)
			value[i] ^= v;
	}
	int query(int x) {
		int ans = 0;
		for (int i = x; i; i -= i & -i)
			ans ^= value[i];
		return ans;
	}
	void init(int x) {
		n = x;
	}
} BIT;
vector <int> a[MAXN];
int value[MAXN], depth[MAXN];
int num[MAXN], rit[MAXN];
int father[MAXN][MAXLOG];
int n, timer;
void work(int pos, int fa) {
	depth[pos] = depth[fa] + 1;
	father[pos][0] = fa;
	for (int i = 1; i < MAXLOG; i++)
		father[pos][i] = father[father[pos][i - 1]][i - 1];
	num[pos] = ++timer;
	for (unsigned i = 0; i < a[pos].size(); i++)
		if (a[pos][i] != fa) work(a[pos][i], pos);
	rit[pos] = timer;
}
int lca(int x, int y) {
	if (depth[x] < depth[y]) swap(x, y);
	for (int i = MAXLOG - 1; i >= 0; i--)
		if (depth[father[x][i]] >= depth[y]) x = father[x][i];
	if (x == y) return x;
	for (int i = MAXLOG - 1; i >= 0; i--)
		if (father[x][i] != father[y][i]) {
			x = father[x][i];
			y = father[y][i];
		}
	return father[x][0];
}
int main() {
	scanf("%d", &n);
	BIT.init(n);
	for (int i = 1; i <= n; i++)
		scanf("%d", &value[i]);
	for (int i = 1; i < n; i++) {
		int x, y;
		scanf("%d%d", &x, &y);
		a[x].push_back(y);
		a[y].push_back(x);
	}
	work(1, 0);
	for (int i = 1; i <= n; i++)
		BIT.modify(num[i], rit[i], value[i]);
	int q; scanf("%d", &q);
	while (q--) {
		char c;
		int x, y;
		scanf("\n%c%d%d", &c, &x, &y);
		if (c == 'C') {
			BIT.modify(num[x], rit[x], value[x] ^ y);
			value[x] = y;
		} else {
			int ans = BIT.query(num[x]) ^ BIT.query(num[y]);
			ans ^= value[lca(x, y)];
			if (ans) printf("Yes\n");
			else printf("No\n");
		}
	}
	return 0;
}

查看评论

[bzoj2819]Nim

Description给出一棵树,每次修改一个点的值或询问x,y之间的路径上的数组成的石子游戏先手有没有必胜方案。(普通版SG) n,m...
  • alan_cty
  • alan_cty
  • 2016年06月15日 21:02
  • 383

[BZOJ2819]Nim(树链剖分)

那些上演着繁华不肯谢幕的年华里开出一朵地老天荒的花。
  • Clove_unique
  • Clove_unique
  • 2016年05月12日 08:20
  • 674

BZOJ 2819 Nim 树链剖分

题目大意:两个小人在树上玩Nim游戏,问有没有必胜策略。 思路:尼姆游戏:如果所有石子的异或值为0就是必败局面。异或有如下性质:x ^ y ^ z = x ^ (y ^ z),所以就可以进行...
  • jiangyuze831
  • jiangyuze831
  • 2014年09月28日 08:39
  • 1064

【Bzoj2819】Nim

题意给定一棵树,两个操作: 1.询问若在v到u间的路径上的石子堆中玩Nim游戏,是否有必胜策略。 2.把堆v中的石子数变为k。作为一个解[ka]决[guo]了这道题的人,来分[kou]析[hu]一...
  • Zhayan9QvQ
  • Zhayan9QvQ
  • 2017年03月17日 20:40
  • 173

bzoj2819 Nim

http://www.lydsy.com/JudgeOnline/problem.php?id=2819 题意:对一棵树单点修改和询问链上各点权作为Nim游戏的初始局面先手是否有必胜策略。n,q 众所...
  • jr_mz
  • jr_mz
  • 2015年12月23日 14:56
  • 586

Bzoj2819 Nim

给定一棵n个节点的无根树,有2种操作: 1、询问x到y的路径上的点权异或和 2、修改某个点的点权Solution直接上树剖。#include...
  • Elemmir
  • Elemmir
  • 2016年04月20日 21:01
  • 179

【bzoj2819】 Nim

www.lydsy.com/JudgeOnline/problem.php?id=2819 (题目链接)题意:动态树上路径异或和。Solution   Nim取石子游戏的sg值就是每堆石子的异或和,...
  • MashiroSky
  • MashiroSky
  • 2016年09月18日 21:54
  • 150

【bzoj2819】Nim

Description著名游戏设计师vfleaking,最近迷上了Nim。普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取。谁不能取谁输。这个游戏...
  • w_yqts
  • w_yqts
  • 2017年07月05日 18:39
  • 124

bzoj2819: Nim

题意:树上的NIM游戏,每次取出一条链,问先手是否有必胜策略。 思路:动态树or树链剖分维护链异或和,为0则没有,否则有。LCT死活就是TLE,代码就不贴了。...
  • thy_asdf
  • thy_asdf
  • 2015年06月22日 20:12
  • 353

BZOJ2819 Nim

题目大意给定一棵树,有两种操作。 1 u v 询问若在v到u间的路径上的石子堆中玩Nim游戏,先手是否有必胜策略。 2 v k 将v节点上的石子个数改为k 请输出所有询问的答案(Yes/No)S...
  • qq_35880977
  • qq_35880977
  • 2017年12月13日 18:43
  • 61
    个人资料
    持之以恒
    等级:
    访问量: 9725
    积分: 2683
    排名: 1万+
    文章分类
    文章存档