【BZOJ】【3164】【HEOI2013】Eden的博弈问题
树形DP
这题在考场上直接写的TreeDP……当时也没想出一个像样的暴力来对拍……好像只能这么直接做了……?
都说是博弈树了,转移关系都给的这么直接了……也没啥难度了吧= =(怪不得大家都不愿意写题解)
我的思路是这样的:
如果黑方想赢,那么:
1.在一个决策方为黑方的节点,对于它来说,最小黑方胜集合就是所有儿子中最小的那个 最小黑方胜集合
2.在一个决策方为白方的节点,它的最小黑方胜集合是所有儿子的最小黑方胜集合的并
那么现在我们就可以通过子节点的最小黑方胜集合,推出在某个节点状态下的最小黑方胜集合的大小,然而我们容易发现:哪些元素可能是最小黑方胜集合中的元素,也是满足这个转移的:
1.对每个节点维护一个mn[x]表示这个最小xx集合的大小,如果mn[son[i]]==mn[fa],就把son的节点集合并入fa的,如果mn[son[i]]<mn[fa],就把fa的节点集合改为son的。
第二种情况下的话直接并吧……$mn[fa]=\sum mn[son[i]]$
同理我们也能找出所有可能在最小白方胜集合中的叶节点……
求个并,随便搞搞出解即可
P.S.这题其实求树上某个节点的“最小黑方胜”集合内可能的节点时,求集合的并其实最简单的,拿链表搞搞就可以……但是蒟蒻不会写QAQ(没写过),加上昨天刚好考了一道可并堆的题目,就拿可并堆写了,权当复习……
/**************************************************************
Problem: 3164
User: Tunix
Language: C++
Result: Accepted
Time:648 ms
Memory:30304 kb
****************************************************************/ //Huce #6 B
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
using namespace std; int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>'') {if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<='') {v=v*+ch-''; ch=getchar();}
return v*sign;
}
typedef long long LL;
const int N=,INF=~0u>>;
/*******************tamplate********************/
int hd[N],to[N],ne[N],cnt;
void add(int x,int y){
to[++cnt]=y; ne[cnt]=hd[x]; hd[x]=cnt;
}
struct node{int v,l,r,dis;}t[N];
#define L t[x].l
#define R t[x].r
int n,m,black[N],white[N],rt[N],mn[N],tot,fa[N]; int merge(int x,int y){
if (!x || !y) return x+y;
if (t[x].v>t[y].v) swap(x,y);
R=merge(R,y);
if (t[L].dis<t[R].dis) swap(L,R);
t[x].dis=t[R].dis+;
return x;
}
bool sign[N];
void dfs(int x,bool now){
if (!hd[x]){
mn[x]=;
rt[x]=++tot;
t[tot].v=x;
t[tot].l=t[tot].r=t[tot].dis=;
return;
}
if (sign[x]==now) mn[x]=INF; else mn[x]=;
for(int i=hd[x];i;i=ne[i]){
sign[to[i]]=sign[x]^;
dfs(to[i],now);
if (sign[x]==now){
if (mn[x]>mn[to[i]]){
mn[x]=mn[to[i]];
rt[x]=rt[to[i]];
}else if (mn[x]==mn[to[i]]){
rt[x]=merge(rt[x],rt[to[i]]);
}
}else{
mn[x]+=mn[to[i]];
rt[x]=merge(rt[x],rt[to[i]]);
}
}
}
int ans[N];
int main(){
#ifndef ONLINE_JUDGE
freopen("B.in","r",stdin);
// freopen("output.txt","w",stdout);
#endif
n=getint();
F(i,,n){
fa[i]=getint(); add(fa[i],i);
}
tot=; sign[]=;
dfs(,);
int num1=;
while(rt[]){black[++num1]=t[rt[]].v; rt[]=merge(t[rt[]].l,t[rt[]].r);}
sort(black+,black+num1+);
tot=; memset(rt,,sizeof rt);
dfs(,);
int num2=;
while(rt[]){white[++num2]=t[rt[]].v; rt[]=merge(t[rt[]].l,t[rt[]].r);}
sort(white+,white+num2+);
int num=;
for(int i=,j=;i<=num1 && j<=num2;i++){
while(black[i]>white[j] && j<=num2) j++;
if (black[i]==white[j]) ans[++num]=black[i];
}
int sum=;
F(i,,num) sum^=ans[i];
printf("%d %d %d\n",ans[],num,sum);
return ;
}
3164: [Heoi2013]Eden的博弈问题
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 110 Solved: 84
[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
1
1
2
2
3
3
Sample Output
HINT
对于100% 的数据,1 ≤ n ≤ 200,000 ,且对于节点 i(i ≠ 1 ),其父节点的编号小于i。
Source
【BZOJ】【3164】【HEOI2013】Eden的博弈问题的更多相关文章
- BZOJ 3164: [Heoi2013]Eden的博弈问题
3164: [Heoi2013]Eden的博弈问题 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 134 Solved: 98[Submit][St ...
- BZOJ 3163: [Heoi2013]Eden的新背包问题( 背包dp )
从左到右, 从右到左分别dp一次, 然后就可以回答询问了. ---------------------------------------------------------- #include< ...
- bzoj 3163: [Heoi2013]Eden的新背包问题
Description "寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听."失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的 ...
- BZOJ3163&Codevs1886: [Heoi2013]Eden的新背包问题[分治优化dp]
3163: [Heoi2013]Eden的新背包问题 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 428 Solved: 277[Submit][ ...
- P4095 [HEOI2013]Eden 的新背包问题
P4095 [HEOI2013]Eden 的新背包问题 题解 既然假定第 i 个物品不可以选,那么我们就设置两个数组 dpl[][] 正序选前i个物品,dpr[][] 倒序选前i个物品 ,价格不超过 ...
- 3163: [Heoi2013]Eden的新背包问题
Description "寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听."失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的 ...
- bzoj3163: [Heoi2013]Eden的新背包问题
Description “寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听.”失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的感觉,却不能回忆起她 ...
- bzoj 3165: [Heoi2013]Segment 动态凸壳
3165: [Heoi2013]Segment Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 202 Solved: 89[Submit][Stat ...
- BZOJ 3168: [Heoi2013]钙铁锌硒维生素 [线性基 Hungary 矩阵求逆]
3168: [Heoi2013]钙铁锌硒维生素 题意:给一个线性无关组A,再给一个B,要为A中每个向量在B中选一个可以代替的向量,替换后仍然线性无关.判断可行和求字典序最小的解 PoPoQQQ orz ...
随机推荐
- Winform TreeView 单选
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) { //通过鼠标或者键盘触发事件,防止修改节点的Checke ...
- [leetcode]_Balanced Binary Tree
第四道树题,逐渐能写递归了.虽然最后AC的代码还是看了网络,但是距离成功攻克此类问题仅一步之遥. 题目:一棵树,判断是否为AVL.(AVL条件:树上任意一点的左右子树的高度差<=1) 思路:树依 ...
- 【转】IE11的变化
1.navigator.userAgent中不再包含“MSIE”关键字 2.用javascript的判断是否是IE11的方法是: var isIE11 = (sUserAgent.toLowerCas ...
- Oracle 直方图理论
一.何为直方图 直方图是一种几何形图表,它是根据从生产过程中收集来的质量数据分布情况,画成以组距为底边.以频数为高度的一系列连接起来的直方型矩形图,如图所示 二.ORACLE 直方图 在Oracle中 ...
- 十天学会单片机Day3 D/A与A/D转换器
D/A转换器 1.二进制权电阻网络型D/A转换器 基准电压Vref 数据D(d3d2d1d0) 输出模拟电压V0 i0 = Vref/8R i1 = Vref/4R i2 = Vref/ ...
- 3.css中的颜色
css中颜色的设置形式主要有三种方式:颜色名称.十六进制代码和十进制代码. 在古老的 HTML4 时,颜色名称只有 16 种. 颜色名称 十六进制代码 十进制代码 含义 black #000000 ...
- <bootstrap>bs2和3的区别</bootstrap>
实验室的list网站开始动工了,准备打算用bootstrap作布局. 大前天去本部停了长html5峰会大连站的讲演,着急往回赶,很多感兴趣的东西都没有听到,但是还是了解了一些html5的新特性 电脑端 ...
- Telerik XML 数据源绑定的问题
Telerik GridView 默认的 XElement 数据源的直接绑定,会导致内置的sort, filter ,group等功能无法使用. 原因在于Telerik GridView的那些功能是根 ...
- jquery的异步获取返回值为中文时乱码解决方法
用jqgrid异步获取列表值,遇到个问题,服务器端从数据库取到的数据没有出现中文乱码问题(日志打出来是没有乱码的),但是异步传到客户的时候却出现了乱码. 服务器端已经编码过了(UTF-8编码).开始一 ...
- About Inside the Azure Storage Outage of November 18th
Channel 9的官方解释 http://channel9.msdn.com/posts/Inside-the-Azure-Storage-Outage-of-November-18th 曾经在自己 ...