AtCoder 2376 Black and White Tree

D - Black and White Tree



Time limit : 2sec / Memory limit : 256MB

Score : 900 points

Problem Statement

There is a tree with N vertices numbered 1 through N. The i-th of the N?1 edges connects vertices ai and bi.

Initially, each vertex is uncolored.

Takahashi and Aoki is playing a game by painting the vertices. In this game, they alternately perform the following operation, starting from Takahashi:

  • Select a vertex that is not painted yet.
  • If it is Takahashi who is performing this operation, paint the vertex white; paint it black if it is Aoki.

Then, after all the vertices are colored, the following procedure takes place:

  • Repaint every white vertex that is adjacent to a black vertex, in black.

Note that all such white vertices are repainted simultaneously, not one at a time.

If there are still one or more white vertices remaining, Takahashi wins; if all the vertices are now black, Aoki wins. Determine the winner of the game, assuming that both persons play optimally.

Constraints

  • 2≤N≤105
  • 1≤ai,biN
  • aibi
  • The input graph is a tree.

Input

Input is given from Standard Input in the following format:

N
a1 b1
:
aN?1 bN?1

Output

Print First if Takahashi wins; print Second if Aoki wins.


Sample Input 1

3
1 2
2 3

Sample Output 1

First

Below is a possible progress of the game:

  • First, Takahashi paint vertex 2 white.
  • Then, Aoki paint vertex 1 black.
  • Lastly, Takahashi paint vertex 3 white.

In this case, the colors of vertices 12 and 3 after the final procedure are black, black and white, resulting in Takahashi‘s victory.


Sample Input 2

4
1 2
2 3
2 4

Sample Output 2

First

Sample Input 3

6
1 2
2 3
3 4
2 5
5 6

Sample Output 3

Second

貌似几百年没有做题了。。。。

题解见注释

/*
    f[x]表示以x为根的子树中,先把x染成白之后对方下一步是否会在x子树中操作
    g[x]表示以x为根的子树中,先手是否能获得胜利。

    当我们枚举致胜节点为root时,先手能赢当且仅当g[root]=1. 

	初始化(对于单点):
	     g[x]=1;
	     f[x]=0;

	转移:
	    1.f[x]等于所有儿子的g的位或

		 这个不难理解,因为只要有一个儿子的g为1的话,我们先把x染白,
		 对方一定会在g为1的这个子树中操作,不然就输了。

		2.g[x]等于所有儿子的f的位与

		 这个也不难理解,因为只有所有儿子的f都为1了,我们才可以依次把每个儿子染白
		 最后依然有先手优势来染x,然后就赢了hhhh

	考虑上述算法仅适用于根固定的情况 ,我们可以把它扩展一下,
	第一遍dfs预处理以某个节点为根的函数值,
	第二遍dfs在每个节点O(1)计算出函数值。
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#define ll long long
#define maxn 100005
#define pb push_back
using namespace std;
vector<int> son[maxn];
int n,m,g[maxn];
int f[maxn];
bool win=0;

void dfs1(int x,int fa){
	int sz=son[x].size()-1,to;
	f[x]=0,g[x]=1;

	for(int i=0;i<=sz;i++){
		to=son[x][i];
		if(to==fa) continue;;
		dfs1(to,x);
		f[x]|=g[to],g[x]&=f[to];
	}
}

void dfs2(int x,int fa,int fa_f,int fa_g){
	int sz=son[x].size()-1,to;
	int hzf[sz+2],hzg[sz+2];
	hzf[sz+1]=1,hzg[sz+1]=0;

	if(g[x]&fa_f) win=1;

	for(int i=sz;i>=0;i--){
		hzf[i]=hzf[i+1];
		hzg[i]=hzg[i+1];
		to=son[x][i];
		if(to==fa) continue;

		hzf[i]&=f[to];
		hzg[i]|=g[to];
	}

	for(int i=0;i<=sz;i++){
		to=son[x][i];
		if(to==fa) continue;

		dfs2(to,x,fa_g|hzg[i+1],fa_f&hzf[i+1]);
		fa_g|=g[to];
		fa_f&=f[to];
	}
}

int main(){
	int uu,vv;
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		scanf("%d%d",&uu,&vv);
		son[uu].pb(vv);
		son[vv].pb(uu);
	}

	dfs1(1,0);
	dfs2(1,0,1,0);

	if(win) puts("First");
	else puts("Second");

	return 0;
}

  

原文地址:https://www.cnblogs.com/JYYHH/p/8440729.html

时间: 2024-11-08 21:15:47

AtCoder 2376 Black and White Tree的相关文章

AtCoder Beginner Contest 152 - F - Tree and Constraints (容斥定理+树上路径的性质)

AtCoder Beginner Contest 152 - F - Tree and Constraints (容斥定理+树上路径的性质) We have a tree with NN vertices numbered 11 to NN. The ii-th edge in this tree connects Vertex aiai and Vertex bibi. Consider painting each of these edges white or black. There ar

AtCoder Grand Contest 014

AtCoder Grand Contest 014 A - Cookie Exchanges 有三个人,分别有\(A,B,C\)块饼干,每次每个人都会把自己的饼干分成相等的两份然后给其他两个人.当其中有一个人的饼干数量是奇数的时候停止,求会进行几次这样子的操作,或者会永远进行下去. 首先无解的情况一定是三个数都是相等的偶数. 否则直接暴力模拟就行了.(盲猜答案不会很大) 证明一下答案的范围:不妨令\(A\le B\le C\),那么最大值和最小值之间的差就是\(C-A\),那么执行完一次操作之后

AtCoder刷题记录

神仙AtCoder思维量巨大,很适合我用来提高智商qwq ARC066C Addition and Subtraction Hard 首先要发现两个性质. 加号右边不会有括号 显然,有括号也可以被删去. \(op_i\)和\(A_{i+1}\)之间只会有一个括号 有多个括号的话只保留最外边那个,显然答案不变. 然后就可以定义状态:\(dp_{i,j}\)表示前\(i\)个数,还有\(j\)个未闭合的左括号,得到的最大答案. 由于只有减号右边有括号,所以只要知道左边有几个未闭合的左括号,就可以知道

【AtCoder】AGC014

AGC014 链接 A - Cookie Exchanges 发现两个数之间的差会逐渐缩小,所以只要不是三个数都相同,那么log次左右一定会得到答案 #include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define enter

AtCoder Grand Contest 014 E:Blue and Red Tree

题目传送门:https://agc014.contest.atcoder.jp/tasks/agc014_e 题目翻译 有一棵有\(N\)个点的树,初始时每条边都是蓝色的,每次你可以选择一条由蓝色边构成的简单路径,让这条路径的两个端点间连上一条红边,然后断开这条路径上的某条蓝边.这样做\(N-1\)次,就可以把原本的蓝树变成红树.现在给你蓝树和红树的样子,问你可不可能把给出的蓝树变成给出的红树.\(N\leqslant 10^5\) 题解 先膜一发大佬的题解:https://blog.csdn.

AtCoder Regular Contest 063 E:Integers on a Tree

题目传送门:https://arc063.contest.atcoder.jp/tasks/arc063_c 题目翻译 给你一个树,上面有\(k\)个点有权值,问你是否能把剩下的\(n-k\)个点全部填上权值,使得每条边链接的两个点权值相差\(1\),如果可以做到需要输出任意一组方案. 题解 我们考虑每条边权值为\(1\)或\(-1\),那么相当于黑白染色一样,所有点权值的奇偶性也都是确定的.如果与读入的\(k\)个点中某个点相冲突了就\(GG\).另外每个点的取值范围都可以转化成一段区间\([

AtCoder Regular Contest 093 E: Bichrome Spanning Tree(生成树)

Bichrome Spanning Tree 题意: 给出一个n个点,m条边的无向连通图,现在要给每条边染色,可以染成黑色或者白色. 现在要求在染色完毕后,找出一个至少包含一条黑边和一条白边的最小生成树,使其权值和为X. 问这样的染色方案有多少个? 题解: 题目要求找出一个至少包含一条黑边和白边的最小生成树,那么可能就会存在这种情况:原图的最小生成树所有边都为同色,那这不是我们要求的:我们这时就会去掉一条权值最大的边,再添一条边进来. 那么我们就可以算出包含指定边的最小生成树,方法就是先加我们指

AtCoder AGC030B Tree Burning

题目链接 https://atcoder.jp/contests/agc030/tasks/agc030_b 题解 细节好题.. 首先假设第一步往右走,那么可以发现当拐弯的次数一定时路径是唯一的 于是可以枚举这个值 然后很烦的是枚举之后要分奇偶讨论.. 最后再翻过来做一遍处理第一步往左走就行了 时间复杂度\(O(n)\) 代码 #include<cstdio> #include<cstdlib> #include<iostream> #include<algori

Atcoder #017 agc017 D.Game on Tree 树上NIM 博弈

LINK 题意:树上NIM的模板题,给出一颗树,现有操作删去端点不为根节点的边,其另一端节点都将被移除,不能取者为败 思路:一看就是个NIM博弈题,只是搬到树上进行,树上DFS进行异或 记得#014D题也是一模一样的博弈...巨水 比赛B题没想出来先做了这题:P /** @Date : 2017-07-09 21:15:04 * @FileName: D 树上删边 NIM 博弈.cpp * @Platform: Windows * @Author : Lweleth ([email protec