4169: Lmc的游戏

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 44  Solved: 25

Description

RHL有一天看到lmc在玩一个游戏。
"愚蠢的人类哟,what are you doing",RHL说。
"我在玩一个游戏。现在这里有一个有n个结点的有根树,其中有m个叶子结点。这m个叶子从1到m分别被给予了一个
号码,每个叶子的号码都是独一无二的。一开始根节点有一个棋子,两个玩家每次行动将棋子移动到当前节点的一
个儿子节点。当棋子被移动到某个叶节点的时候游戏结束,这个叶节点的号码即为该局游戏的result。先手的玩家
要最大化result,后手的玩家要最小化这个result。"
"你不先问一下我是谁吗 = ="
"那么,who are you"
"我是这个世界的创造者,维护者和毁灭者,整个宇宙的主宰,无所不知,无所不能的,三个字母都大写的RHL。"
"既然你这么厉害,那你一定知道,在两个玩家都无限聪明的情况下,在树的形态已知的情况下,在叶子的编号可
以任意安排的情况下,游戏的result最大是多少咯。"

Input

输入数据第一行有一个正整数n,表示结点的数量。n<=200000
接下来n-1行,每行有两个正整数u和v,表示的父亲节点是u。

Output

输出一行2个非负整数,分别表示result的最大值和最小值。

Sample Input

5
1 2
1 3
2 4
2 5

Sample Output

3 2
【样例解释】
有3,4,5三个叶子。若令3号叶子的编号是3,则先手可以移到3号结点,故result最大是3。若3号叶子的编号是2,
则先手可以移到3号结点,故result最小是2.

HINT

Source

【分析】
【想出来了
然而网上没有题解,我就写写,好少人做这题。
如果你是先手的话,你肯定选子树里面能得到答案最大的那个走。
如果你是后手的话,你肯定选子树里面能得到答案最小的那个走。
$mx[i]$表示走$i$这棵子树,$result$最大是多少(指的是,你在子树填入$a1<a2<a3...$最大是排名第几的,下同)。
$mn[i]$表示走$i$这棵子树,$result$最小是多少。
当你是偶数层($root$这层视为0),即先手操作,你应该是$result=max(子树1,子树2,子树3....)$
最大化$result$显然是让各子树的$result$都最大化,然后呢,因为你取的是$max$,所以最好就是把其他子树都堆在前面,然后让$mx$最大的子树放在最后。
即$mx[x]=max(mx[x],sm[x]-(sm[y]-mx[y]))$; (sm是子树里面的叶子节点个数)
最小化$result$就是让子树都先选$1~mn$放在前面,即$mn[x]+=mn[y]$;
其实解题本质,就是你自己想想怎么样分配最好嘛。。
当$dep$为奇数,是$result=min(max(),max(),...)$这样的形式如下
$mx[x]=\sum (mx[y]-1) +1$;

  $mn[x]=min(mn[x],mn[y])$;

  也不知道怎么说。。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 #define INF 0xfffffff
 8 #define Maxn 200010
 9
10 int mymax(int x,int y) {return x>y?x:y;}
11 int mymin(int x,int y) {return x<y?x:y;}
12
13 int mx[Maxn],mn[Maxn];
14
15 struct node
16 {
17     int x,y,next;
18 }t[Maxn];
19 int first[Maxn],len;
20 void ins(int x,int y)
21 {
22     t[++len].x=x;t[len].y=y;
23     t[len].next=first[x];first[x]=len;
24 }
25
26 int sm[Maxn];
27 void dfs(int x,int dep)
28 {
29     sm[x]=0;
30     if(first[x]==0)
31     {
32         sm[x]=1;
33         mn[x]=mx[x]=1;return;
34     }
35     for(int i=first[x];i;i=t[i].next)
36     {
37         int y=t[i].y;
38         dfs(y,dep^1);
39         sm[x]+=sm[y];
40     }
41     mx[x]=0;mn[x]=0;
42     if(dep) mx[x]=1,mn[x]=INF;
43     for(int i=first[x];i;i=t[i].next)
44     {
45         int y=t[i].y;
46         if(!dep)
47         {
48             mx[x]=mymax(mx[x],sm[x]-(sm[y]-mx[y]));
49             mn[x]+=mn[y];
50         }
51         else
52         {
53             mx[x]+=mx[y]-1;
54             mn[x]=mymin(mn[x],mn[y]);
55         }
56     }
57 }
58
59 int main()
60 {
61     int n;
62     scanf("%d",&n);
63     int rt=0;
64     for(int i=1;i<=n;i++) rt+=i;
65     len=0;
66     memset(first,0,sizeof(first));
67     for(int i=1;i<n;i++)
68     {
69         int x,y;
70         scanf("%d%d",&x,&y);
71         ins(x,y);
72         rt-=y;
73     }
74     dfs(rt,0);
75     printf("%d %d\n",mx[rt],mn[rt]);
76     return 0;
77 }

View Code

转载于:https://www.cnblogs.com/Konjakmoyu/p/6691849.html

【BZOJ 4169】 4169: Lmc的游戏 (树形DP)相关推荐

  1. BZOJ.3227.[SDOI2008]红黑树tree(树形DP 思路)

    BZOJ orz MilkyWay天天做sxt! 首先可以树形DP:\(f[i][j][0/1]\)表示\(i\)个点的子树中,黑高度为\(j\),根节点为红/黑节点的最小红节点数(最大同理). 转移 ...

  2. AcWing323. 战略游戏(树形DP)题解

    题目传送门 题目描述 鲍勃喜欢玩电脑游戏,特别是战略游戏,但有时他找不到解决问题的方法,这让他很伤心. 现在他有以下问题. 他必须保护一座中世纪城市,这条城市的道路构成了一棵树. 每个节点上的士兵可以 ...

  3. P2016 战略游戏[树形dp]

    题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得这些士兵能 ...

  4. 【bzoj 1812】[Ioi2005]riv(树形dp)

    1812: [Ioi2005]riv Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 433  Solved: 246 [Submit][Status] ...

  5. bzoj 3162: 独钓寒江雪 树哈希+树形dp

    题意 给出一棵无标号无根树,问本质不同的最大独立集数量.答案模1e9+7. n<=500000 分析 对于一般的情况,我们可以先找出树的重心作为根,然后进行树形dp.这样做有什么好处呢?通过根的 ...

  6. 323. 战略游戏 (树形dp)

    题目 题意: 给定n个点的树,选择最少的点,使得可以涵盖到所有的边.(不一定n-1条边,至多10*n条边) 思路: 树形dp. f[i][0]: 以i为根且选择i的最少点数的方案 f[i][1]: 以 ...

  7. BZOJ 3611 [Heoi2014]:虚树+树形DP

    时空隧道 今天考试T3正解是虚树-..(看到这个名字我好虚啊-.) 现在我们需要处理一棵树上k个点的询问,做一遍树形DP-- 复杂度是O(n)的,q个询问,感觉复杂度很爆炸-..>_<-- ...

  8. BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4042 (Luogu) https://www.luogu.org/prob ...

  9. BZOJ 1413: [ZJOI2009]取石子游戏 博弈+Dp

    title BZOJ 1413 Description 在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行, ...

  10. bzoj 2435: [Noi2011]道路修建【树形dp】

    dp求size和deep,然后对每条边模拟求代价即可 #include<iostream> #include<cstdio> #include<algorithm> ...

最新文章

  1. SPU表管理之更新SPU表数据
  2. 1322项!这所高校国自然基金立项再创新高 | 附各高校最新统计
  3. 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include “pch.h“”?
  4. 分布式Session一致性概述
  5. 解决IDEA本地仓库有jar包却无法引用和打包问题
  6. 树链剖分 完美的想法
  7. 没有写入hosts文件权限
  8. _如何在 Linux 上安装 Minecraft 服务器
  9. MAC上安装JDK后的所在目录
  10. android 获取用户名和密码,如何通过Android中的电子邮件地址获取用户名和密码
  11. 打印机打印时显示选择传真调解器或服务器,惠普打印机选择打印时为什么显示发送传真...
  12. 使用java制作一个个税计算器
  13. 新唐(nuvoton)单片机学习资料汇总
  14. 运维工程师种种尴尬的瞬间情景,你有无?
  15. 几何图形及计算公式查询
  16. OpenCV-图像高光调整
  17. Kubernetes详解(四十一)——Secret创建
  18. 我的第一个QT程序——QT开发环境的配置
  19. Python 生成个性二维码
  20. 人工智能在物联网项目中的应用

热门文章

  1. 【HDU - 5014】Number Sequence(贪心构造)
  2. 【牛客 - 2B】树(思维,dp,有坑)
  3. 从零开始学视觉Transformer(4):ViT模型全流程解析
  4. java中能构成循环的语句_《编程导论(Java)#183;3.2.4 循环语句》
  5. php4和php5的区别,什么是PHP 4和PHP 5之间的区别是什么-php是什么文件
  6. 齐博php百度编辑器上传图片_php版百度编辑器ueditor怎样给上传图片自动添加水印?...
  7. Linux学习:第三章-Linux常用命令-1
  8. Android开发(1) | Fragment 的应用——新闻应用
  9. leetcode1075. 项目员工 I(SQL)
  10. UNIX(多线程):28---双buffer “无锁” 设计