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]=;
  30. if(first[x]==)
  31. {
  32. sm[x]=;
  33. mn[x]=mx[x]=;return;
  34. }
  35. for(int i=first[x];i;i=t[i].next)
  36. {
  37. int y=t[i].y;
  38. dfs(y,dep^);
  39. sm[x]+=sm[y];
  40. }
  41. mx[x]=;mn[x]=;
  42. if(dep) mx[x]=,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]-;
  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=;
  64. for(int i=;i<=n;i++) rt+=i;
  65. len=;
  66. memset(first,,sizeof(first));
  67. for(int i=;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,);
  75. printf("%d %d\n",mx[rt],mn[rt]);
  76. return ;
  77. }

【BZOJ 4169】 4169: Lmc的游戏 (树形DP)的更多相关文章

  1. P2016 战略游戏——树形DP大水题

    P2016 战略游戏 树形DP 入门题吧(现在怎么是蓝色标签搞不懂): 注意是看见每一条边而不是每一个点(因为这里错了好几次): #include<cstdio> #include< ...

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

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

  3. BZOJ.2286.[SDOI2011]消耗战(虚树 树形DP)

    题目链接 BZOJ 洛谷P2495 树形DP,对于每棵子树要么逐个删除其中要删除的边,要么直接断连向父节点的边. 如果当前点需要删除,那么直接断不需要再管子树. 复杂度O(m*n). 对于两个要删除的 ...

  4. [洛谷P2016] 战略游戏 (树形dp)

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

  5. 邱老师玩游戏(树形DP) UESTC - 1136

    邱老师最近在玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中邱老师允许攻克M个城堡并获得里面的宝物. 但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其 ...

  6. P2016 战略游戏 (树形DP)

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

  7. BZOJ 2152 聪聪可可(树形DP)

    聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了 ...

  8. NOI Online 游戏 树形dp 广义容斥/二项式反演

    LINK:游戏 还是过于弱鸡 没看出来是个二项式反演,虽然学过一遍 但印象不深刻. 二项式反演:有两种形式 一种是以恰好和至多的转换 一种是恰好和至少得转换. 设\(f_i\)表示至多的方案数 \(g ...

  9. bzoj 1060 [ZJOI2007]时态同步(树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1060 [题意] 求最少的增加量,使得以rt为根的树中由一个结点出发的所有到叶子结点的路 ...

  10. BZOJ 1509: [NOI2003]逃学的小孩( 树形dp )

    树形dp求出某个点的最长3条链a,b,c(a>=b>=c), 然后以这个点为交点的最优解一定是a+2b+c.好像还有一种做法是求出树的直径然后乱搞... ----------------- ...

随机推荐

  1. Crash Consistency : FSCK and Journaling

    现在开始今天的第三篇博客的撰写,不能扯淡了,好多任务啊.但是还是忍不住吐槽一下,之前选择这篇文章纯属是个意外,我把Crash看做了Cache,唉,要不然也就不用写这篇文章了. 1. 这篇博客讲什么? ...

  2. 【转】ubuntu 11.04使用apt-get安装软件时一直提示E:unable to locate package

    问题: VMware虚拟机安装了ubuntu 11.04,在使用apt-get安装软件时一直提示E:Unable to locate package. 百度了原因,说是要更新源,使用命令:sudo a ...

  3. 你知道吗?31种 CSS 选择器的应用

    选择器(selector)是CSS中很重要的概念,所有HTML语言中的标记都是通过不同的CSS选择器进行控制的.用户只需要通过选择器对不同的HTML标签进行控制,并赋予各种样式声明,即可实现各种效果. ...

  4. 浅析 Spring Aop

    aop也是Spring里比较重要的一个点,最近把源码看了下,这里总结一下 使用上主要就下面的点注意下: 相关的Annotaion Around Before After AfterReturning ...

  5. Spring Boot中对log4j进行多环境不同日志级别的控制

    之前介绍了在<Spring boot中使用log4j记录日志>,仅通过log4j.properties对日志级别进行控制,对于需要多环境部署的环境不是很方便,可能我们在开发环境大部分模块需 ...

  6. 【shell】shell编程总结

    总结一下在写shell脚本时的常见注意事项: 1.shell脚本中的命令最好用命令的全路径,如果不知道全路径可以用which cmd查找命令的全路径. 2.shell脚本中定义环境变量用export ...

  7. linux下C语言实现的哈希链表【转】

    转自:http://blog.chinaunix.net/uid-28458801-id-4276934.html 操作系统:ubuntu10.04 前言:     在稍微大点的项目中,基本都会遇到算 ...

  8. keepalived主备切换后的arp问题【转】

    使用keepalived的时候主机挂了,备机显示绑定了VIP.但是此时实际还是不能访问.其实就是网关的arp缓存没有刷新.   在服务器上执行一下就行了 arping -I eth0 -c 5 -s ...

  9. 关于Java代码优化的35条建议

    代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是, ...

  10. 自动ftp 上传

    #!/bin/sh ftp -n<<END_FTP open 192.168.1.4 user codfei duibuqi //用户名codfei 密码duibuqi binary pr ...