[2017湖南集训7-9]营养餐 阶梯博弈
来源:互联网 发布:淘宝淘宝客怎么开通 编辑:程序博客网 时间:2024/04/29 15:43
设num[i]表示点i还能取走多少个水果,num[i]=a[i]-sigma(a[son]*b[son]),
可以发现点i拿走k个后,num[i]-=k,num[fa[i]]+=k*b[i],于是就能想到阶梯博弈了,先把b[i]=0的点与fa[i]的边断掉,因为取了i点的水果对fa[i]是没有影响的,剩下的森林里,SG函数值即为对奇数层的Nim,即numi的异或和。因为对手把偶数层的移到奇数层,只要把那些石子继续移到下一个奇数层即可。
代码:
#include<iostream>#include<cstdio>#include<ctime>#include<algorithm>#include<cstring>#define ll long longusing namespace std;const int maxn=50010;int a[maxn],b[maxn],n=0;ll ans=0;int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}struct edge{ int t; edge *next; }*con[maxn];void ins(int x,int y){ edge *p; p=new edge; p->t=y; p->next=con[x]; con[x]=p;}void dfs(int v,int fa,int d){ if(b[v]==0) d=1; ll dw=0; for(edge *p=con[v];p!=NULL;p=p->next) if(p->t!=fa) { dfs(p->t,v,d+1); dw+=a[p->t]*b[p->t]; } dw=a[v]-dw; if(d&1) ans^=dw; }int main(){ freopen("meal.in","r",stdin); freopen("meal.out","w",stdout); srand(time(NULL)); int ca=read(); while(ca--) { for(int i=1;i<=n;i++) con[i]=NULL; n=read(); for(int i=1;i<=n;i++) a[i]=read(); for(int i=1;i<=n;i++) b[i]=read(); for(int i=1;i<=n-1;i++) { int x=read(),y=read(); ins(x,y); ins(y,x); } ans=0; dfs(1,0,1); if(ans==0) puts("NO"); else puts("YES"); } return 0;}
阅读全文
0 0
- [2017湖南集训7-9]营养餐 阶梯博弈
- 营养餐 阶梯博弈
- 阶梯Nim 与【JZOJ 5500】 营养餐
- [JZOJ5500]【清华集训2017模拟12.10】营养餐
- JZOJ 5500. 【清华集训2017模拟12.10】营养餐
- 【JZOJ 5500】【清华集训2017模拟12.10】营养餐
- [2017湖南集训7-9]大佬的问题 (数点问题)
- [2017湖南集训7-7]第一题 DP
- [2017湖南集训7-8]暗牧 虚树+最短路
- 阶梯博弈
- 阶梯博弈
- 阶梯博弈
- 阶梯博弈
- 阶梯博弈
- 阶梯博弈
- 阶梯博弈
- 阶梯博弈
- 阶梯博弈
- Android三种常见软件架构MVC MVP MVVM
- UVA220_Othello
- 单例模式
- Linux中crond服务与crontab用法
- 17-7-9周总结(Andrew Ng机器学习Chapter1-6笔记)
- [2017湖南集训7-9]营养餐 阶梯博弈
- 二分法查找
- htmlunit 模拟功能
- 对于所有对象都用的通用方法
- 第八章 进程调度和时间
- shell初识—2
- Python3中append与extend的区别
- Java I/O机制总结
- solr服务器安装在linux上面的时候出现there exists no core with name index异常