n<=10000的树,节点有初始石头数<=1000,进行这样的游戏:两人轮流行动,我先手,每次可以选一个节点(≠1)把不超过m<=1000个石头移到父亲,最后所有石头都在节点1,没法行动的算输。有T<=10000次修改操作,把某点初始石头数修改,求每次修改后能否先手胜。

突然发现博弈全忘光了。。

首先看:

最简单的一种情况,可以用SG函数表示二号点的情况。可以打表或手推或显然得出SG值:0 1 2 …… m 0 1 2 …… m …… SG(i)=i%(m+1)。

接着看并联情况:

这就是几个互不影响的游戏的组合,用SG定理,把SG值异或起来即可。

重点来了!串联的情况!

http://blog.csdn.net/longshuai0821/article/details/7793043 贴个阶梯博弈先

先不看四号和五号。如果在二号先手就必胜了,那么对手肯定不会甘于在二号点移动而是跑去三号点试图改变局面,但这是徒劳的:我可以把他移过来2号点的东西全部丢到一号点,从而毫不影响先手胜的局面,也就是三号对答案毫无影响。现在看四不看五,由于三号对答案无影响,四号应该发挥积极作用,也就是如果从四号拿了一些到三号,是会影响结果的,这等价于从四号点拿了一些石头丢掉了!因为三号点是没用点,有多少石头都无所谓!也就是说四号点和二号点两个互不影响地构成了这个游戏且规则相同。最后看五号点,如果对手把五号点丢给四号,那么我也可以把丢到四号的那些石头丢给三号。

综上,与根距离为偶数的点都是废点。所以只需要记录并更新距离是奇数的点SG值即可。

 #include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<iostream>
using namespace std; int n,t,m;
#define maxn 10011
struct Edge{int to,next;}edge[maxn<<];int first[maxn],le=;
void in(int x,int y) {Edge &e=edge[le];e.to=y;e.next=first[x];first[x]=le++;}
void insert(int x,int y) {in(x,y);in(y,x);}
int val[maxn],dep[maxn],ans;
void dfs(int x,int fa)
{
dep[x]=dep[fa]+;
if (dep[x]&) ans^=val[x];
for (int i=first[x];i;i=edge[i].next)
{
const Edge &e=edge[i];if (e.to==fa) continue;
dfs(e.to,x);
}
}
int calc(int x) {return x%(m+);}
int main()
{
scanf("%d%d%d",&n,&t,&m);
int x,y;
for (int i=;i<=n;i++)
{
scanf("%d%d",&x,&y);
insert(x,i);
val[i]=calc(y);
}
dep[]=-;ans=;dfs(,);
for (int i=;i<=t;i++)
{
scanf("%d%d",&x,&y);
if (dep[x]&)
{
ans^=val[x];
val[x]=calc(y);
ans^=val[x];
}
printf(ans?"Yes\n":"No\n");
}
return ;
}

BZOJ1777: [Usaco2010 Hol]rocks 石头木头的更多相关文章

  1. 【博弈论】【SG函数】bzoj1777 [Usaco2010 Hol]rocks 石头木头

    仅有距根节点为奇数距离的节点的石子被移走对答案有贡献,∵即使偶数的石子被移走,迟早会被再移到奇数,而奇数被移走后,不一定能够在移到偶数(到根了). 最多移L个:石子数模(L+1),比较显然,也可以自己 ...

  2. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡 [高斯消元 概率DP]

    1778: [Usaco2010 Hol]Dotp 驱逐猪猡 题意:一个炸弹从1出发p/q的概率爆炸,否则等概率走向相邻的点.求在每个点爆炸的概率 高斯消元求不爆炸到达每个点的概率,然后在一个点爆炸就 ...

  3. BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元

    BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元 题意: 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 3 ...

  4. BZOJ 1778: [Usaco2010 Hol]Dotp 驱逐猪猡

    1778: [Usaco2010 Hol]Dotp 驱逐猪猡 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 563  Solved: 216[Submi ...

  5. 【BZOJ1778】[Usaco2010 Hol]Dotp 驱逐猪猡 期望DP+高斯消元

    [BZOJ1778][Usaco2010 Hol]Dotp 驱逐猪猡 Description 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300 ...

  6. 【BZOJ1776】[Usaco2010 Hol]cowpol 奶牛政坛 树的直径

    [BZOJ1776][Usaco2010 Hol]cowpol 奶牛政坛 Description 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N. ...

  7. [bzoj1776][Usaco2010 Hol]cowpol 奶牛政坛_倍增lca

    [Usaco2010 Hol]cowpol 奶牛政坛 题目大意: 数据范围:如题面. 题解: 第一想法是一个复杂度踩标程的算法..... 就是每种政党建一棵虚树,然后对于每棵虚树都暴力求直径就好了,复 ...

  8. bzoj1779 [Usaco2010 Hol]Cowwar 奶牛战争(网络流)

    1779: [Usaco2010 Hol]Cowwar 奶牛战争 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 302  Solved: 131[Sub ...

  9. BZOJ1778 [Usaco2010 Hol]Dotp 驱逐猪猡

    首先我们列出转移矩阵$M$,$M_{i, j} = \frac {1 - \frac{p} {q}} {deg[i]}$(i,j之间有边)or $M_{i, j} = 0$(i,j之间没边) 则这个矩 ...

随机推荐

  1. Java提供的序列化和反序列化

    序列化:是指将Java对象转换为二进制数据. 反序列化:将二进制数据转换为Java对象. 与序列化功能相关的类有: java.io.Serializable; java.io.ObjectOutput ...

  2. java实现斐波那契的两种方法

    package com.ywx.count; /** * 斐波那契数列(地推方式要比递归方式的效率要高) * @author Vashon(yangwenxue) * date:20150320 */ ...

  3. Java Web MVC实例

    开发环境 Eclipse Java EE IDE for Web Developers. Version: Luna Service Release 2 (4.4.2) tomcat:7.0 数据库: ...

  4. 通过HA方式操作HDFS

    之前操作hdfs的时候,都是固定namenode的地址,然后去操作.这个时候就必须判断namenode的状态为active还是standby,比较繁琐,如果集群使用了HA的形式,就很方便了 直接上代码 ...

  5. XSS漏洞扫描经验分享

    关于XSS漏洞扫描,现成的工具有不少,例如paros.Acunetix等等,最近一个项目用扫描工具没有扫出漏洞,但还是被合作方找出了几个漏洞.对方找出的漏洞位置是一些通过javascript.ajax ...

  6. 登录脚本重构by封装

    package com.gubai.selenium; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; imp ...

  7. Hadoop分布式集群安装

        环境准备     操作系统使用ubuntu-16.04.2 64位 JDK使用jdk1.8 Hadoop使用Hadoop 2.8版本     镜像下载  操作系统     操作系统使用ubun ...

  8. 如何处理Docker的错误消息request canceled:Docker代理问题

    在本地安装Kubernetes时,遇到错误消息: request canceled while waiting for connection(Client.Timeout exceeded while ...

  9. 汇编4OPCODE

    opcode原理 前缀域 切换操作数大小前缀 : 066h 可以将32位的操作数切换成16位的操作数 B8 00010000 | MOV EAX,0x100     66:B8 0001 | MOV ...

  10. break,continue,return的区别

    break,continue,return的区别 break 当break语句用于循环语句时,会终止执行循环,并执行循环后代码(如果有的话). function main() { for(var i ...