题目描述

  给你一棵有根树,每个点有两个属性\(a,b\)

  两人轮流操作,每次要减小一个点的\(a\)值,要求

\[a_x\geq\sum_{i\in child(x)}a_ib_i
\]

  保证初始状态满足这个要求。

  \(\sum n\leq 5\times {10}^5\)

题解

  令

\[s_x=a_x-\sum_{i\in child(x)}a_ib_i
\]

  每次操作相当于减小\(s_x\),把\(s_{f_x}\)加上减小的值$\times $$b_x$。

  当\(b_x=0\)时\(x\)对\(f_x\)没有影响,可以把\(x\)视为根。

  把原树划分成森林后做阶梯博弈即可。

  计算出所有深度为\(x\)的点的\(s_x\)异或和,如果非零则先手胜,否则后手胜。

  阶梯博弈:所有深度为偶数的点的信息是没有用的。如果把某一个偶数层的点的值挪到奇数层的点上,对手可以再把这些值挪到偶数层的点上。所以最好情况都不会对自己有利,就不会这么决策。

  时间复杂度:\(O(n)\)

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. using namespace std;
  4. struct graph
  5. {
  6. int v[100010];
  7. int t[100010];
  8. int h[50010];
  9. int n;
  10. void add(int x,int y)
  11. {
  12. n++;
  13. v[n]=y;
  14. t[n]=h[x];
  15. h[x]=n;
  16. }
  17. void init()
  18. {
  19. memset(h,0,sizeof h);
  20. n=0;
  21. }
  22. };
  23. graph g;
  24. int f[100010];
  25. int ban[100010];
  26. int s[100010];
  27. int a[100010];
  28. int b[100010];
  29. void dfs(int x,int fa)
  30. {
  31. f[x]=fa;
  32. s[x]=a[x];
  33. int i;
  34. for(i=g.h[x];i;i=g.t[i])
  35. if(g.v[i]!=fa)
  36. {
  37. dfs(g.v[i],x);
  38. s[x]-=a[g.v[i]]*b[g.v[i]];
  39. }
  40. }
  41. int ans;
  42. void dfs2(int x,int d)
  43. {
  44. if((d&1))
  45. ans^=s[x];
  46. int i;
  47. for(i=g.h[x];i;i=g.t[i])
  48. if(g.v[i]!=f[x]&&!ban[g.v[i]])
  49. dfs2(g.v[i],d+1);
  50. }
  51. void solve()
  52. {
  53. int n;
  54. scanf("%d",&n);
  55. int i,x,y;
  56. for(i=1;i<=n;i++)
  57. scanf("%d",&a[i]);
  58. for(i=1;i<=n;i++)
  59. scanf("%d",&b[i]);
  60. g.init();
  61. for(i=1;i<n;i++)
  62. {
  63. scanf("%d%d",&x,&y);
  64. g.add(x,y);
  65. g.add(y,x);
  66. }
  67. for(i=1;i<=n;i++)
  68. ban[i]=0;
  69. for(i=1;i<=n;i++)
  70. if(!b[i]||i==1)
  71. ban[i]=1;
  72. dfs(1,0);
  73. ans=0;
  74. for(i=1;i<=n;i++)
  75. if(ban[i])
  76. dfs2(i,1);
  77. if(ans)
  78. printf("YES\n");
  79. else
  80. printf("NO\n");
  81. }
  82. int main()
  83. {
  84. #ifndef ONLINE_JUDGE
  85. freopen("c.in","r",stdin);
  86. freopen("c.out","w",stdout);
  87. #endif
  88. int t;
  89. scanf("%d",&t);
  90. while(t--)
  91. solve();
  92. return 0;
  93. }

【XSY2716】营养餐 博弈论的更多相关文章

  1. IT人生知识分享:博弈论的理性思维

    背景: 昨天看了<最强大脑>,由于节目比较有争议性,不知为什么,作为一名感性的人,就想试一下如果自己理性分析会是怎样的呢? 过程是这样的: 中国队(3人)VS英国队(4人). 1:李建东( ...

  2. [poj2348]Euclid's Game(博弈论+gcd)

    Euclid's Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9033   Accepted: 3695 Des ...

  3. 博弈论揭示了深度学习的未来(译自:Game Theory Reveals the Future of Deep Learning)

    Game Theory Reveals the Future of Deep Learning Carlos E. Perez Deep Learning Patterns, Methodology ...

  4. TYVJ博弈论

    一些比较水的博弈论...(为什么都没有用到那什么SG呢....) TYVJ 1140  飘飘乎居士拯救MM 题解: 歌德巴赫猜想 #include <cmath> #include < ...

  5. 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 ...

  6. 【POJ】2234 Matches Game(博弈论)

    http://poj.org/problem?id=2234 博弈论真是博大精深orz 首先我们仔细分析很容易分析出来,当只有一堆的时候,先手必胜:两堆并且相同的时候,先手必败,反之必胜. 根据博弈论 ...

  7. 博弈论入门小结 分类: ACM TYPE 2014-08-31 10:15 73人阅读 评论(0) 收藏

    文章原地址:http://blog.csdn.net/zhangxiang0125/article/details/6174639 博弈论:是二人或多人在平等的对局中各自利用对方的策略变换自己的对抗策 ...

  8. poj 3710 Christmas Game 博弈论

    思路:首先用Tarjan算法找出树中的环,环为奇数变为边,为偶数变为点. 之后用博弈论的知识:某点的SG值等于子节点+1后的异或和. 代码如下: #include<iostream> #i ...

  9. hdoj 1404 Digital Deletions(博弈论)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1404 一看就是博弈论的题目,但并没有什么思路,看了题解,才明白 就是求六位数的SG函数,暴力一遍,打表 ...

随机推荐

  1. 我的微信小程序第三篇(app.json)

    前言 端午节回家了,所以好多天没有更新,只想说还是待在家里舒服呀,妈妈各种做好吃的,小侄子侄女各种粘着我在室外玩,导致我三天下来不仅胖了一圈,还黑了一圈,上班第一天有同事就说我晒黑了,哭~~~,为了防 ...

  2. Yii1.1框架实现PHP极光推送消息通知

    一.下载极光推送PHP SDK,解压后放在/protected/components/目录下,如下图所示: 二.完善修改下官方的demo例子,我这里复制一份demo,改为NotifyPush.php, ...

  3. 使用ajax请求后端程序时,关于目标程序路径问题

    这里涉及到和PHP中类似的问题,有待更新!!!

  4. Rime 小狼毫 注意事项

    https://rime.im/https://github.com/rime/weasel/pulse 打不出中文可能是,没有五笔需要的文件: wubi_pinyin.schema.yamlCtrl ...

  5. Mysql 5.7 Windows 版本(zip)的安装简单过程

    1. 下载zip包 https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.25-winx64.zip 2. 找一个目录解压缩 3. 简单进行安装: ...

  6. taro 与uni-app对比

    https://www.jianshu.com/p/03e08399587e   (copy)

  7. combineByKey

    示例:

  8. python之路--进程内容补充

    一. 进程的其他方法 进程id, 进程名字, 查看进程是否活着(is_alive()), terminate()发送结束进程的信号 import time import os from multipr ...

  9. python3 自动识图

    一.安装依赖库 pip install pytesseract pip install pillow 二.安装识图引擎tesseract-ocr https://pan.baidu.com/s/1Qa ...

  10. docker学习笔记一

    知识点: 1)docker简介 2)docker安装,仓库配置 3)docker仓库镜像拉取,导出,导入,删除 4)docker容器操作,容器的创建,删除,运行,停止,日志查看等. 5)  docke ...