3164: [Heoi2013]Eden的博弈问题

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 134  Solved: 98
[Submit][Status][Discuss]

Description

对于有两个玩家的,状态透明且状态转移确定的博弈游戏,博弈树是常用的分析工具。博弈树是一棵有根树,其中的节点为游戏的状态。若节点B的父亲是A,则说明状态A能通过一次决策转移到状态B。每个状态都有一个唯一的决策方,即这个状态下应该由哪一方做出决策。我们规定双方在任何时候都是轮流做出决策的,即树上相邻节点的决策方总是不相同的。在这个问题中,我们只关心两个玩家的胜负情况,且规定游戏不会出现平局。 我们称两个玩家分别为黑方和白方,其中根节点的决策方为黑方。显然每个节点 只有两个状态:黑方胜和白方胜。若某内节点(即存在后继节点的节点)的决策 方为黑方,则该节点为黑方胜的充要条件为它的儿子中存在黑方胜的节点,反之亦然。求解博弈树即为判明博弈树根节点的状态。如果我们得知了所有叶节点(即无后继节点的节点)的状态,那么博弈树就 很容易求解了。但是现在的情况是所有叶节点的状态均为未知的,需要进一步的计算。对于一个由叶节点构成的集合S,如果S中的节点均被判明为黑方胜,就可以断言根节点为黑方胜的话,则称 S为一个黑方胜集合。对于黑方胜集合 S,
如果对于任意的黑方胜集合 S’均满足|S| ≤ |S’ |(|S|表示集合S中的元素数目),
 则称S为一个最小黑方胜集合。同样地,也可以定义白方胜集合和最小白方胜集合。 
 Eden最近在研究博弈树问题。他发现,如果一个叶节点既属于某一个最小黑方胜集合,又属于一个最小白方胜集合,那么求解这个节点的状态显然最有益 于求解根节点的状态。像这样的叶节点就称之为关键叶节点。对于一棵给定的博弈树,Eden想要知道哪些叶节点是关键叶节点。

Input

每个测试点包含一组测试数据。 
测试数据的第一行包含一个正整数n,表示博弈树的节点数目。节点从1到n 编号,且 1 号节点为根节点。 
之后n–1 行,每行包含一个正整数。第i行的正整数表示节点i的父节点的编号。

Output

在一行内输出三个空格分隔的正整数,分别是编号最小的关键叶节点的编号,
关键叶节点的数目和所有关键叶节点的编号的异或和。

Sample Input

7
1
1
2
2
3
3

Sample Output

4 4 0

HINT

对于100% 的数据,1 ≤  n ≤ 200,000 ,且对于节点 i(i ≠ 1 ),其父节点的编号小于i。

Source

 

[Submit][Status][Discuss]

这贪心好水啊~~~

 #include <cstdio>

 template <class T>
inline T min(const T &a, const T &b)
{
return a < b ? a : b;
} const int mxn = ;
const int inf = ; int n, fat[mxn]; int hd[mxn];
int to[mxn];
int nt[mxn]; inline void addEdge(int u, int v)
{
static int tot = ;
nt[++tot] = hd[u];
to[tot] = v;
hd[u] = tot;
} int dep[mxn]; void preDFS(int u, int d)
{
dep[u] = d; for (int i = hd[u]; i; i = nt[i])
preDFS(to[i], d ^ );
} namespace tree1
{
int f[mxn];
int v[mxn]; void DFS1(int u)
{
if (!hd[u])
f[u] = ;
else
{
if (dep[u])
{
f[u] = ; for (int i = hd[u]; i; i = nt[i])
DFS1(to[i]), f[u] = f[u] + f[to[i]];
}
else
{
f[u] = inf; for (int i = hd[u]; i; i = nt[i])
DFS1(to[i]), f[u] = min(f[u], f[to[i]]);
}
}
} void DFS2(int u)
{
if (!hd[u])
v[u] = ;
else
{
if (dep[u])
{
for (int i = hd[u]; i; i = nt[i])
DFS2(to[i]);
}
else
{
for (int i = hd[u]; i; i = nt[i])
if (f[to[i]] == f[u])DFS2(to[i]);
}
}
} inline void solve(void)
{
DFS1();
DFS2();
}
} namespace tree2
{
int f[mxn];
int v[mxn]; void DFS1(int u)
{
if (!hd[u])
f[u] = ;
else
{
if (!dep[u])
{
f[u] = ; for (int i = hd[u]; i; i = nt[i])
DFS1(to[i]), f[u] = f[u] + f[to[i]];
}
else
{
f[u] = inf; for (int i = hd[u]; i; i = nt[i])
DFS1(to[i]), f[u] = min(f[u], f[to[i]]);
}
}
} void DFS2(int u)
{
if (!hd[u])
v[u] = ;
else
{
if (!dep[u])
{
for (int i = hd[u]; i; i = nt[i])
DFS2(to[i]);
}
else
{
for (int i = hd[u]; i; i = nt[i])
if (f[to[i]] == f[u])DFS2(to[i]);
}
}
} inline void solve(void)
{
DFS1();
DFS2();
}
} signed main(void)
{
scanf("%d", &n); for (int i = ; i <= n; ++i)
scanf("%d", fat + i); for (int i = ; i <= n; ++i)
addEdge(fat[i], i); preDFS(, ); tree1::solve();
tree2::solve(); int ans1 = inf, ans2 = , ans3 = ; for (int i = ; i <= n; ++i)
if (tree1::v[i] && tree2::v[i])
{
ans1 = min(ans1, i);
ans2 = ans2 + ;
ans3 = ans3 ^ i;
} printf("%d %d %d\n", ans1, ans2, ans3);
}

@Author: YouSiki

BZOJ 3164: [Heoi2013]Eden的博弈问题的更多相关文章

  1. BZOJ 3163: [Heoi2013]Eden的新背包问题( 背包dp )

    从左到右, 从右到左分别dp一次, 然后就可以回答询问了. ---------------------------------------------------------- #include< ...

  2. bzoj 3163: [Heoi2013]Eden的新背包问题

    Description "寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听."失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的 ...

  3. 【BZOJ】【3164】【HEOI2013】Eden的博弈问题

    树形DP 这题在考场上直接写的TreeDP……当时也没想出一个像样的暴力来对拍……好像只能这么直接做了……? 都说是博弈树了,转移关系都给的这么直接了……也没啥难度了吧= =(怪不得大家都不愿意写题解 ...

  4. BZOJ3163&Codevs1886: [Heoi2013]Eden的新背包问题[分治优化dp]

    3163: [Heoi2013]Eden的新背包问题 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 428  Solved: 277[Submit][ ...

  5. P4095 [HEOI2013]Eden 的新背包问题

    P4095 [HEOI2013]Eden 的新背包问题 题解 既然假定第 i 个物品不可以选,那么我们就设置两个数组 dpl[][] 正序选前i个物品,dpr[][] 倒序选前i个物品 ,价格不超过 ...

  6. 3163: [Heoi2013]Eden的新背包问题

    Description "寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听."失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的 ...

  7. bzoj3163: [Heoi2013]Eden的新背包问题

    Description “寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听.”失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的感觉,却不能回忆起她 ...

  8. bzoj 3165: [Heoi2013]Segment 动态凸壳

    3165: [Heoi2013]Segment Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 202  Solved: 89[Submit][Stat ...

  9. BZOJ 3168: [Heoi2013]钙铁锌硒维生素 [线性基 Hungary 矩阵求逆]

    3168: [Heoi2013]钙铁锌硒维生素 题意:给一个线性无关组A,再给一个B,要为A中每个向量在B中选一个可以代替的向量,替换后仍然线性无关.判断可行和求字典序最小的解 PoPoQQQ orz ...

随机推荐

  1. Linux下查找进程id并强制停止进程的脚本

    Linux下的tomcat的停止脚本shutdown.sh经常失败,造成tomcat进程没关闭.所以只能手动查找进程id,然后用kill命令来强制停止.每次都要这样查一下,然后再杀进程.感觉有点麻烦, ...

  2. [Oracle][OnlineREDO]数据库无法启动时的对应策略:

    [Oracle][OnlineREDO]数据库无法启动时的对应策略: 1. Start with mount. SQL> conn / as sysdba  SQL> startup mo ...

  3. 解决Jira和Confluence访问打开越来越缓慢问题

    Jira和Confluence部署在同一台服务器上,跑一段时间后,发现访问jira和confluence时,打开越来越缓慢.这是因为根据主机物理内存不同,默认的java虚拟机内存也会不同(一个较低值) ...

  4. 分布式监控系统Zabbix-批量添加聚合图形

    之前部署了Zabbix(3.4.4版本)监控环境,由于主机比较多,分的主机组也比较多,添加聚合图形比较麻烦,故采用python脚本进行批量添加聚合图形.脚本下载地址:https://pan.baidu ...

  5. Linux下防御DDOS攻击的操作梳理

    DDOS的全称是Distributed Denial of Service,即"分布式拒绝服务攻击",是指击者利用大量“肉鸡”对攻击目标发动大量的正常或非正常请求.耗尽目标主机资源 ...

  6. centos下部署NTP时间服务器同步环境记录

    1)服务端部署 安装所需软件包 [root@test ~]# yum -y install ntp ntpdate 服务端自己先手工同步一次时间. [root@test ~]# ntpdate ntp ...

  7. Ansible之playbook的使用总结 - 运维笔记

    之前详细介绍了Ansible的安装, 配置, 以及Ansible常用模块的使用. 下面对Ansible的playbook用法做一小结. 为什么引入playbook?一般运维人员完成一个任务, 比如安装 ...

  8. 12.25daily_scrum

    今天是圣诞节,大家在度过了一个愉快的节日同时,同时也收到了最好的圣诞礼物,就是调试工作已经进入尾声,接下来我们组的主要任务就是M2阶段的总结了.为了更好的做好M2阶段的收官工作,我们组决定分配相当的一 ...

  9. 数学战神app(小学生四则运算app)进度

    背景音乐仍有瑕疵,还在完善,不过大概完成,完善按钮声音,提示音等. 许家豪:负责代码程序设计 陈思明:界面背景美化 吴旭涛.王宏财:查缺补漏

  10. CSS字体大小之em,px,百分比

    首先要记住网页中常规字体的大小为16px. px是用来设置字体的绝对大小.通常为用于物理值的设置.我们在互联网上看到的常规字体大小为16px.而em是指相对于父元素的大小.1em是父元素的1倍,2em ...