AtCoder 2376 Black and White Tree

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder 2376 Black and White Tree相关的知识,希望对你有一定的参考价值。

?????????i+1   ??????   alter   blog   for   game   ??????   ??????   ict   

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,bi???N
  • ai???bi
  • 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;
}

??????

以上是关于AtCoder 2376 Black and White Tree的主要内容,如果未能解决你的问题,请参考以下文章

AtCoder Regular Contest 146 B Plus and AND

AtCoder Regular Contest 146 B Plus and AND

AtCoder Regular Contest 146 B Plus and AND

Cat Snuke and a Voyage AtCoder - 2660

Red and Black

AtCoder AGC037E Reversing and Concatenating