【XSY2716】营养餐 博弈论
题目描述
给你一棵有根树,每个点有两个属性\(a,b\)
两人轮流操作,每次要减小一个点的\(a\)值,要求
\]
保证初始状态满足这个要求。
\(\sum n\leq 5\times {10}^5\)
题解
令
\]
每次操作相当于减小\(s_x\),把\(s_{f_x}\)加上减小的值$\times $$b_x$。
当\(b_x=0\)时\(x\)对\(f_x\)没有影响,可以把\(x\)视为根。
把原树划分成森林后做阶梯博弈即可。
计算出所有深度为\(x\)的点的\(s_x\)异或和,如果非零则先手胜,否则后手胜。
阶梯博弈:所有深度为偶数的点的信息是没有用的。如果把某一个偶数层的点的值挪到奇数层的点上,对手可以再把这些值挪到偶数层的点上。所以最好情况都不会对自己有利,就不会这么决策。
时间复杂度:\(O(n)\)
代码
#include<cstdio>
#include<cstring>
using namespace std;
struct graph
{
int v[100010];
int t[100010];
int h[50010];
int n;
void add(int x,int y)
{
n++;
v[n]=y;
t[n]=h[x];
h[x]=n;
}
void init()
{
memset(h,0,sizeof h);
n=0;
}
};
graph g;
int f[100010];
int ban[100010];
int s[100010];
int a[100010];
int b[100010];
void dfs(int x,int fa)
{
f[x]=fa;
s[x]=a[x];
int i;
for(i=g.h[x];i;i=g.t[i])
if(g.v[i]!=fa)
{
dfs(g.v[i],x);
s[x]-=a[g.v[i]]*b[g.v[i]];
}
}
int ans;
void dfs2(int x,int d)
{
if((d&1))
ans^=s[x];
int i;
for(i=g.h[x];i;i=g.t[i])
if(g.v[i]!=f[x]&&!ban[g.v[i]])
dfs2(g.v[i],d+1);
}
void solve()
{
int n;
scanf("%d",&n);
int i,x,y;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
scanf("%d",&b[i]);
g.init();
for(i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
g.add(x,y);
g.add(y,x);
}
for(i=1;i<=n;i++)
ban[i]=0;
for(i=1;i<=n;i++)
if(!b[i]||i==1)
ban[i]=1;
dfs(1,0);
ans=0;
for(i=1;i<=n;i++)
if(ban[i])
dfs2(i,1);
if(ans)
printf("YES\n");
else
printf("NO\n");
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
#endif
int t;
scanf("%d",&t);
while(t--)
solve();
return 0;
}
【XSY2716】营养餐 博弈论的更多相关文章
- IT人生知识分享:博弈论的理性思维
背景: 昨天看了<最强大脑>,由于节目比较有争议性,不知为什么,作为一名感性的人,就想试一下如果自己理性分析会是怎样的呢? 过程是这样的: 中国队(3人)VS英国队(4人). 1:李建东( ...
- [poj2348]Euclid's Game(博弈论+gcd)
Euclid's Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9033 Accepted: 3695 Des ...
- 博弈论揭示了深度学习的未来(译自:Game Theory Reveals the Future of Deep Learning)
Game Theory Reveals the Future of Deep Learning Carlos E. Perez Deep Learning Patterns, Methodology ...
- TYVJ博弈论
一些比较水的博弈论...(为什么都没有用到那什么SG呢....) TYVJ 1140 飘飘乎居士拯救MM 题解: 歌德巴赫猜想 #include <cmath> #include < ...
- Codeforces 549C. The Game Of Parity[博弈论]
C. The Game Of Parity time limit per test 1 second memory limit per test 256 megabytes input standar ...
- 【POJ】2234 Matches Game(博弈论)
http://poj.org/problem?id=2234 博弈论真是博大精深orz 首先我们仔细分析很容易分析出来,当只有一堆的时候,先手必胜:两堆并且相同的时候,先手必败,反之必胜. 根据博弈论 ...
- 博弈论入门小结 分类: ACM TYPE 2014-08-31 10:15 73人阅读 评论(0) 收藏
文章原地址:http://blog.csdn.net/zhangxiang0125/article/details/6174639 博弈论:是二人或多人在平等的对局中各自利用对方的策略变换自己的对抗策 ...
- poj 3710 Christmas Game 博弈论
思路:首先用Tarjan算法找出树中的环,环为奇数变为边,为偶数变为点. 之后用博弈论的知识:某点的SG值等于子节点+1后的异或和. 代码如下: #include<iostream> #i ...
- hdoj 1404 Digital Deletions(博弈论)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1404 一看就是博弈论的题目,但并没有什么思路,看了题解,才明白 就是求六位数的SG函数,暴力一遍,打表 ...
随机推荐
- Centos7 ssh配置RSA证书登录
修改sshd配置文件 vim /etc/ssh/sshd_config #增加以下三项 RSAAuthentication yes PubkeyAuthentication yes Authorize ...
- winform启动界面+登录窗口
需求场景:先展示启动界面,然后打开登录界面,如果登录成功就跳转到主界面 首先在程序的入口路径加载启动界面,使用ShowDialog显示界面, 然后在启动界面中添加定时器,来实现显示一段时间的效果,等到 ...
- js 移动端 多图上传 预览 删除 base64转为url 传给后端
说下主要的逻辑,首先是利用input type="file",上传文件,然后判断文件类型是否是图片,这里要注意(multiple,安卓一次一张,ios可以多张). 接着把本地图片转 ...
- ActiveMQ入门案例-生产者代码实现
<–start–> 使用Java程序操作ActiveMQ生产消息,代码的复杂度较高,但也没有默写下来的必要. 开发ActiveMQ首先需要导入activemq-all.jar包,如果是ma ...
- 基于vue-cli,sass,vant的移动端项目
项目架构 开始 vue init webpack 项目名称 //新建项目,cd进入新项目 npm install axios //先安装! ...
- Linux安装mysql5.6
安装mysql5.6https://www.cnblogs.com/wangdaijun/p/6132632.html
- windows环境下的git安装及使用
昨天晚上,我用了一个半小时整github,为了便于他人能快速的安装使用,也为了回顾一下自己痛苦的过程,特意写下这篇博客.好的,让我们开始吧.... 我的环境:win10,msysgit1.9.4.0 ...
- Mysql如何快速插入100万条记录?
1.java程序拼接insert带多个value,使一次提交多个值. 2.插入数据之前先删除索引(注意主键不能删除),然后插入数据,最后重建索引 3.可以设置手动commit,用来提高效率 4.使用批 ...
- RBAC模型
1.RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角 ...
- 结巴(jieba)分词
一.介绍: jieba: “结巴”中文分词:做最好的 Python 中文分词组件 “Jieba” (Chinese for “to stutter”) Chinese text segmentatio ...