链接:https://ac.nowcoder.com/acm/contest/3005/F
来源:牛客网

题目描述

现有一个 n 个点,n-1条边组成的树,其中 1 号点为根节点。
牛牛和牛妹在树上玩游戏,他们在游戏开始时分别在树上两个不同的节点上。
在游戏的每一轮,牛牛先走一步,而后牛妹走一步。他们只能走到没有人的空节点上。如果谁移动不了,就输掉了游戏。现在牛牛和牛妹决定随机选择他们分别的起点,于是他们想知道,有多少种游戏开始的方式,使得牛牛存在一种一定获胜的最优策略。
两种开始方式相同,当且仅当在两种开始方式中牛牛,牛妹的开始位置是分别相同的,否则开始方式就被视作不同的。

输入描述:

第一行输入为一个整数 n,代表树的点数。
第二行n-1个整数p2,p3,…,pnp_2,p_3,\ldots,p_{n}p2​,p3​,…,pn​,分别代表2,3,...,n号点的父节点编号。

输出描述:

  1. 一行一个整数,代表答案。
示例1

输入

复制 3
1 2

  1. 3
  2. 1 2

输出

复制 2

  1. 2

说明

  1. 当且仅当牛牛在1号点,牛妹在3号点,或者牛牛在3号点,牛妹在1号点时,牛牛才获胜。
示例2

输入

复制 2
1

  1. 2
  2. 1

输出

复制 0

  1. 0

说明

由于无论如何牛牛都无路可走,因此必然牛妹获胜。
示例3

输入

复制 30
1 1 2 1 2 1 3 2 3 4 2 3 1 2 3 4 2 4 5 6 3 4 12 12 12 13 13 13 13

  1. 30
  2. 1 1 2 1 2 1 3 2 3 4 2 3 1 2 3 4 2 4 5 6 3 4 12 12 12 13 13 13 13

输出

复制 428

  1. 4

说明

  1. QwQ

备注:

  1. n106n \le 10^6n106
    1pi<i1\le p_i < i1pi​<i
  2.  
  3. 思路
      通过画图不难发现只有相隔偶数步时为必胜态,对于每条树链进行间隔点染色,统计不同颜色的点。
      答案就是两种颜色的点的数量*(数量-1)相加
    CODE
  1. #include <bits/stdc++.h>
  2. #define dbg(x) cout << #x << "=" << x << endl
  3.  
  4. using namespace std;
  5. typedef long long LL;
  6.  
  7. template<class T>inline void read(T &res)
  8. {
  9. char c;T flag=;
  10. while((c=getchar())<''||c>'')if(c=='-')flag=-;res=c-'';
  11. while((c=getchar())>=''&&c<='')res=res*+c-'';res*=flag;
  12. }
  13.  
  14. namespace _buff {
  15. const size_t BUFF = << ;
  16. char ibuf[BUFF], *ib = ibuf, *ie = ibuf;
  17. char getc() {
  18. if (ib == ie) {
  19. ib = ibuf;
  20. ie = ibuf + fread(ibuf, , BUFF, stdin);
  21. }
  22. return ib == ie ? - : *ib++;
  23. }
  24. }
  25.  
  26. int qread() {
  27. using namespace _buff;
  28. int ret = ;
  29. bool pos = true;
  30. char c = getc();
  31. for (; (c < '' || c > '') && c != '-'; c = getc()) {
  32. assert(~c);
  33. }
  34. if (c == '-') {
  35. pos = false;
  36. c = getc();
  37. }
  38. for (; c >= '' && c <= ''; c = getc()) {
  39. ret = (ret << ) + (ret << ) + (c ^ );
  40. }
  41. return pos ? ret : -ret;
  42. }
  43.  
  44. const int maxn = 1e6 + ;
  45. LL ans = ;
  46. LL cnt1 = ;
  47. LL cnt0 = ;
  48.  
  49. int cnt = ;
  50. int color[maxn];
  51. int head[maxn << ],nxt[maxn << ];
  52.  
  53. int edge[maxn << ];
  54.  
  55. void add(int a, int b) {
  56. edge[cnt] = b;
  57. nxt[cnt] = head[a];
  58. head[a] = cnt++;
  59. }
  60.  
  61. void dfs(int u) {
  62. //dbg(u),dbg(cnt1),dbg(cnt0);
  63.  
  64. for(int i = head[u]; ~i; i = nxt[i]) {
  65. int v = edge[i];
  66. //dbg(v);
  67. if(v == u) continue;
  68. color[v] = !color[u];
  69. if(color[v] == ) cnt1++;
  70. if(color[v] == ) cnt0++;
  71. dfs(v);
  72. }
  73. }
  74.  
  75. int main()
  76. {
  77. memset(color,,sizeof(color));
  78. int n;
  79. read(n);
  80. ans = ;
  81. memset(head,-,sizeof(head));
  82. for(int i = , x; i <= n; ++i) {
  83. read(x);
  84. add(x,i);
  85. }
  86.  
  87. cnt1 = ;
  88. color[] = ;
  89. dfs();
  90. if(cnt1 < && cnt0 < ) {
  91. printf("0\n");
  92. return ;
  93. }
  94. cout << cnt1*(cnt1-) + cnt0*(cnt0-) << endl;
  95. return ;
  96. }
  1.  

2020牛客寒假算法基础集训营4-F树上博弈的更多相关文章

  1. 2020牛客寒假算法基础集训营2 J题可以回顾回顾

    2020牛客寒假算法基础集训营2 A.做游戏 这是个签到题. #include <cstdio> #include <cstdlib> #include <cstring ...

  2. 2020牛客寒假算法基础集训营1 J题可以回顾回顾

    2020牛客寒假算法基础集训营1 这套题整体来说还是很简单的. A.honoka和格点三角形 这个题目不是很难,不过要考虑周全,面积是1,那么底边的长度可以是1也可以是2, 注意底边1和2会有重复的, ...

  3. 2020牛客寒假算法基础集训营4-I 匹配星星【贪心】

    链接:https://ac.nowcoder.com/acm/contest/3005/I来源:牛客网 示例1 输入 复制 2 1 1 0 2 2 1 2 1 1 0 2 2 1 输出 复制 1 1 ...

  4. 2020牛客寒假算法基础集训营1 F-maki和tree

    链接:https://ac.nowcoder.com/acm/contest/3002/F来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  5. 牛客寒假算法基础集训营4 F Applese 的大奖

    链接:https://ac.nowcoder.com/acm/contest/330/H来源:牛客网 Applese 和它的小伙伴参加了一个促销的抽奖活动,活动的规则如下:有一个随机数生成器,能等概率 ...

  6. 牛客寒假算法基础集训营4 F Applese 的QQ群

    链接:https://ac.nowcoder.com/acm/contest/330/F来源:牛客网 Applese 有一个QQ群.在这个群中,大家互相请教问题.如 b 向 a 请教过问题,就把 a ...

  7. 2020牛客寒假算法基础集训营5 G街机争霸

    题目描述 哎,又是银首,要是你这个签到题少WA一发就金了 牛牛战队的队员打完比赛以后又到了日常甩锅的时间.他们心情悲伤,吃完晚饭以后,大家相约到一个街机厅去solo.牛牛和牛能进入了一个迷宫,这个迷宫 ...

  8. 2020牛客寒假算法基础集训营4 D:子段异或

    D : 子段异或 考察点 : 位运算,前缀和,异或的性质和应用 坑点 : 0 - L 的异或值是 0 的话也是一个区间 相同的值可能有多个,那么这时候区间就会有多个(x * (x + 1) / 2) ...

  9. 2020牛客寒假算法基础集训营6 I.导航系统 (最小生成树)

    https://ac.nowcoder.com/acm/contest/3007/I 题中给定的图必定是一棵树 容易发现,如果将输入的N(N-1)个距离看做N(N-1)条无向边的话,那么如果数据合法, ...

随机推荐

  1. tar命令详解及使用实例

    tar命令 [root@linux ~]# tar [-cxtzjvfpPN] 文件与目录 …. 参数: -c :创建压缩文件 -x :解开压缩文件 -t :查看tar包里面的文件! 上面3个参数只能 ...

  2. JMeter之If Controller深究二

    1.背景 接上文JMeter之If Controller深究一,在上文中提到压测采用的是JMeter3.1版本,本篇继续深究.基本确定问题原因后,宝路这边又做了不同版本的JMeter对比实验,这次加入 ...

  3. 大文件切割(split)

    split提供两种方式对文件进行切割: 根据行数切割,通过-l参数指定需要切割的行数 根据大小切割,通过-b参数指定需要切割的大小 1.1 根据行数切割 如下以一个3.4G大小的日志文件做切割演示,每 ...

  4. Django设置异步任务

    1.安装Django-celery 包:pip install django-celery==3.2.2 2.开启redis服务 需要使用redis做broker,所以在使用异步和定时任务时需要开启r ...

  5. Unity 编辑器开发SceneView GUI控制

    前几天项目需要就做了个类似于Collider EditCollider的功能 下面是我做的效果 基础代码如下: public class ExportCFGInputWindow : EditorWi ...

  6. nrm安装与配置(nrm管理npm源)

    1.nrm nrm(npm registry manager )是npm的镜像源管理工具,有时候国外资源太慢,使用这个就可以快速地在 npm 源间切换 2.安装nrm 在命令行执行命令,npm ins ...

  7. docker配置容器运行jar包

    拉取jdk镜像文件 # docker pull huanwei/alpine-oraclejdk8 创建文件夹编写Dockerfile文件 # mkdir docker # vi Dockerfile ...

  8. Centos 7 使用(Service iptables stop/start)关闭/打开防火墙 Failed to stop iptables.service: Unit iptables.service not loaded.

    背景: 测试部署NetCore 项目到linux 系统时,窗口显示项目部署成功:但是本机无法访问(linux 在虚拟机上[ centos 7.6] );  如下图↓ 能够相互ping  通,(Xshe ...

  9. Android Studio 学习笔记(四):Adapter和RecyclerView说明

    在现版本中,滚动控件有多种,而相比于ListView,GridView,RecyclerView的用途更广,因此将前两者作为Adapter适配器的引入,再对RecyclerView进行简单讲解. MV ...

  10. RxHttp 让你眼前一亮的Http请求框架

    1.前言 RxHttp在今年4月份一经推出,就受到了广大Android 开发者的喜爱,截止本文发表在github上已有1100+star,为此,我自己也建个RxHttp&RxLife 的群(群 ...