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;
}

  

AtCoder 2376 Black and White Tree的更多相关文章

  1. Atcoder D - Black and White Tree(树dp+博弈)

    题目链接:http://agc014.contest.atcoder.jp/tasks/agc014_d 题意:有一棵树先手涂白色,后手涂黑色,直到不能再涂为止.涂完后再把所有黑色直接相邻的白色都变成 ...

  2. Codeforces 260D - Black and White Tree

    260D - Black and White Tree 思路:把两种颜色先按值sort一下,最小值肯定是叶子,然后把这个叶子和另外一中颜色的一个最小值的节点连接起来,再把这个节点变成叶子,把值减掉就可 ...

  3. HDU 5905 Black White Tree(树型DP)

    题目链接  Black White Tree 树型DP,设$f[i][j]$为以$i$为根的子树中大小为$j$的连通块中可以包含的最小黑点数目. $g[i][j]$为以$i$为根的子树中大小为$j$的 ...

  4. 2017国家集训队作业[agc014d]Black and White Tree

    2017国家集训队作业[agc014d]Black and White Tree 题意: ​ 有一颗n个点的树,刚开始每个点都没有颜色.Alice和Bob会轮流对这棵树的一个点涂色,Alice涂白,B ...

  5. AtCoder Grand Contest 014 D:Black and White Tree

    题目传送门:https://agc014.contest.atcoder.jp/tasks/agc014_d 题目翻译 给你一棵树,每次任选一个点染色,先手染白色,后手染黑色.如果最后存在一个白色的点 ...

  6. 【AtCoder AGC023F】01 on Tree(贪心)

    Description 给定一颗 \(n\) 个结点的树,每个点有一个点权 \(v\).点权只可能为 \(0\) 或 \(1\). 现有一个空数列,每次可以向数列尾部添加一个点 \(i\) 的点权 \ ...

  7. AtCoder Grand Contest 010 F - Tree Game

    题目传送门:https://agc010.contest.atcoder.jp/tasks/agc010_f 题目大意: 给定一棵树,每个节点上有\(a_i\)个石子,某个节点上有一个棋子,两人轮流操 ...

  8. AtCoder Grand Contest 018 D - Tree and Hamilton Path

    题目传送门:https://agc018.contest.atcoder.jp/tasks/agc018_d 题目大意: 给定一棵\(N\)个点的带权树,求最长哈密顿路径(不重不漏经过每个点一次,两点 ...

  9. AtCoder Grand Contest 005 C - Tree Restoring

    题目传送门:https://agc005.contest.atcoder.jp/tasks/agc005_c 题目大意: 给定一个长度为\(N\)的整数序列\(A_i\),问能否构造一个\(N\)个节 ...

随机推荐

  1. [18/12/3]蓝桥杯 练习系统 入门级别 Fibonacci数列求模问题 题解思路

    前言略. 看到这个题目本来应该很高兴的,因为什么,因为太TM的基础了啊! 可是当你用常规方法尝试提交OJ时你会发现..hhh...运行超时..(开心地摇起了呆毛 //Fibonacci数列递归一般问题 ...

  2. Linux下vsftp匿名用户配置

    Linux下vsftp匿名用户上传和下载的配置 配置要注意三部分,请一一仔细对照: 1.vsftpd.conf文件的配置(vi /etc/vsftpd/vsftpd.conf) #允许匿名用户登录FT ...

  3. SPOJ 364 Pocket Money 简单DP

    跟矩阵链乘同类型的题…… 输出用%llu不是%I64u…… 几组数据: 141+2*4+3*4+5*00*5*6+7*3+23+0+6+7+0+44*5+7*1*1+12*0+3*4*0+5*6+7+ ...

  4. DAO设计模式的理解

    为了降低耦合性,提出了DAO封装数据库操作的设计模式. 它可以实现业务逻辑与数据库访问相分离.相对来说,数据库是比较稳定的,其中DAO组件依赖于数据库系统,提供数据库访问的接口. 一般的DAO的封装由 ...

  5. [codeforces] 578C Weakness and Poorness || 三分

    原题 题目定义了两个变量: poorness表示一个区间内和的绝对值. weakness表示一个所有区间最大的poornesss 题目要求你求一个x使得 a1 − x, a2 − x, ..., an ...

  6. ubuntu启动报错 Errors were found while checking the disk-drive for /

    开机报这个错误,主要原因是硬盘检测不通过导致的,下面介绍两种方法规避该问题: 修改grub 这个方法网上比较多,直接贴过来: 进入Ubuntu启动菜单时,光标选中 *Ubuntu 后,按键盘上的 e ...

  7. Codeforces Round #527 (Div. 3) ABCDEF题解

    Codeforces Round #527 (Div. 3) 题解 题目总链接:https://codeforces.com/contest/1092 A. Uniform String 题意: 输入 ...

  8. oracle的隐式游标

    游标的概念:     游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理, ...

  9. College student reflects on getting started in open source(一)

    I just completed the first semester of my second year in college, and I'm reflecting on what I learn ...

  10. css垂直居中的几种方式

    1. 对于可以一行处理的 设置 height:apx; line-height:apx; 2.对于一段文字(会多行显示的)            ->2.1如果是可以设置一个固定高度的      ...