bzoj2314: 士兵的放置(树形DP)
0表示被父亲控制,1表示被儿子控制,2表示被自己控制。f表示最少士兵数,g表示方案数。
转移贼难写,写了好久之后写不下去了,看了一眼题解,学习了。。。原来还可以这么搞
比如求f[i][1]的时候,要在所有儿子里选一个儿子的f[to][2]来转移,这有一个非常巧妙的做法,那就是从自己转移...
每次可以选择从f[i][1]+min(f[to][1], f[to][2])转移或者从f[i][0]+f[to][2]转移,并使得f[i][1]比f[i][0]先转移,这样的话相当于每次会从第一次取f[to][2]和已经取过f[to][2]转移,十分正确,非常好写...
还要注意的是如果从f[i][0]转移,方案数得加上g[i][0]*g[to][2]。
- #include<iostream>
- #include<cstring>
- #include<cstdlib>
- #include<cstdio>
- #include<algorithm>
- #define ll long long
- #define MOD(x) ((x)>=mod?(x-mod):(x))
- using namespace std;
- const int maxn=, inf=1e9, mod=;
- struct poi{int too, pre;}e[maxn<<];
- int n, x, y, tot;
- int last[maxn], g[maxn][], f[maxn][];;
- void read(int &k)
- {
- int f=; k=; char c=getchar();
- while(c<'' || c>'') c=='-'&&(f=-), c=getchar();
- while(c<='' && c>='') k=k*+c-'', c=getchar();
- k*=f;
- }
- inline void add(int x, int y){e[++tot]=(poi){y, last[x]}; last[x]=tot;}
- void dfs(int x, int fa)
- {
- f[x][]=maxn; f[x][]=g[x][]=g[x][]=g[x][]=;
- for(int i=last[x], too;i;i=e[i].pre)
- if((too=e[i].too)!=fa)
- {
- dfs(too, x);
- ll tmpf=min(maxn, min(f[x][]+min(f[too][], f[too][]), f[x][]+f[too][])), tmpg=;
- if(f[x][]+f[too][]==tmpf) tmpg+=g[too][];
- if(f[x][]+f[too][]==tmpf) tmpg+=g[too][], tmpg=MOD(tmpg);
- f[x][]=tmpf; g[x][]=1ll*g[x][]*tmpg%mod;
- if(f[x][]+f[too][]==tmpf) g[x][]+=1ll*g[x][]*g[too][]%mod, g[x][]=MOD(g[x][]);
- f[x][]+=f[too][]; f[x][]=min(maxn, f[x][]); g[x][]=1ll*g[x][]*g[too][]%mod;
- tmpf=min(f[too][], min(f[too][], f[too][])); tmpg=;
- if(f[too][]==tmpf) tmpg+=g[too][];
- if(f[too][]==tmpf) tmpg+=g[too][], tmpg=MOD(tmpg);
- if(f[too][]==tmpf) tmpg+=g[too][], tmpg=MOD(tmpg);
- f[x][]+=tmpf; f[x][]=min(maxn, f[x][]); g[x][]=1ll*g[x][]*tmpg%mod;
- }
- }
- int main()
- {
- read(n);
- for(int i=;i<n;i++) read(x), read(y), add(x, y), add(y, x);
- dfs(, );
- if(f[][]<f[][]) printf("%d\n%d", f[][], g[][]);
- else if(f[][]>f[][]) printf("%d\n%d", f[][], g[][]);
- else printf("%d\n%d", f[][], MOD(g[][]+g[][]));
- }
明明答案不会爆int的。。。但是不开LL就WA,至今不明T T 神tm..f的不合法状态是inf加起来爆int了,判了一下之后终于能int过了,因为比LL快也跑到了rk10
为了查这个我WA了一页...
bzoj2314: 士兵的放置(树形DP)的更多相关文章
- 【BZOJ2314】士兵的放置 树形DP
[BZOJ2314]士兵的放置 Description 八中有N个房间和N-1双向通道,任意两个房间均可到达.现在出了一件极BT的事,就是八中开始闹鬼了.老大决定加强安保,现在如果在某个房间中放一个士 ...
- BZOJ 2314: 士兵的放置( 树形dp )
树形dp... dp(x, 0)表示结点x不放士兵, 由父亲控制: dp(x, 1)表示结点x不放士兵, 由儿子控制: dp(x, 2)表示结点x放士兵. ---------------------- ...
- BZOJ2314 士兵的放置
树形DP,恩然后就不会了... 先写了个错的离谱程序...果然WA了 然后开始乱搞,欸,对了! 令f[i], g[i], h[i]分别表示i号节点自己放士兵,被儿子上的士兵控制,不被儿子上的士兵控制但 ...
- 【树形DP】MZOJ_1063_士兵守卫
本题也是这三天来在下写的几篇树形DP之一,但是不知道为什么洛谷上面老是unknown error,...直接去了UVa,说我编译错误...我在想是不是头文件的原因,于是被逼无奈,交了一道c89的代码. ...
- 【树形DP】【P1364】医院放置
传送门 Description 设有一棵二叉树,如图: 其中,圈中的数字表示结点中居民的人口.圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接 ...
- 『战略游戏 最大利润 树形DP』
通过两道简单的例题,我们来重新认识树形DP. 战略游戏(luoguP1026) Description Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题.他要 ...
- 树形dp 入门
今天学了树形dp,发现树形dp就是入门难一些,于是好心的我便立志要发一篇树形dp入门的博客了. 树形dp的概念什么的,相信大家都已经明白,这里就不再多说.直接上例题. 一.常规树形DP P1352 没 ...
- [洛谷P2016] 战略游戏 (树形dp)
战略游戏 题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得 ...
- 初涉树形dp
算是一个……复习以及进阶? 什么是树形dp 树形dp是一种奇妙的dp…… 它的一个重要拓展是和各种树形的数据结构结合,比如说在trie上.自动机上的dp. 而且有些时候还可以拓展到环加外向树.仙人掌上 ...
随机推荐
- php常用的几个预定义变量
__FILE__:返回所在路径文件名和文件名称 __DIR__:返回文件所在的完整目录 __LINE__:返回当前文件代码的行号 __CLASS__:返回当前类名 __FUNCTION__:返回当前方 ...
- Spring Cloud Learning(一): 服务注册
官网https://projects.spring.io/spring-cloud/,spring cloud官网各组件版本为: Component Edgware.SR4 Finchley.SR1 ...
- loadrunner12安装教程
全套五个文件: 独立安装包,插件包,LR安装包,语言包,版本说明书 loadrunner 12安装教程 1.首先下载Loadrunner12安装包.下载下来将会有四个安装包. HP_LoadRunne ...
- JVM自动内存管理机制--读这篇就GO了
之前看过JVM的相关知识,当时没有留下任何学习成果物,有些遗憾.这次重新复习了下,并通过博客来做下笔记(只能记录一部分,因为写博客真的很花时间),也给其他同行一些知识分享. Java自动内存管理机制包 ...
- Nginx快速入门
本文主要介绍nginx的基本配置和操作,并介绍了一些可以完成的简单任务. 假设您已经学习过并已经安装好了nginx服务器. 如果没有,请参阅安装nginx页面(http://www.yiibai.co ...
- CSP201512-2:消除类游戏
引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...
- Tensorflow、Pytorch、Keras的多GPU使用
Tensorflow.Pytorch.Keras的多GPU的并行操作 方法一 :使用深度学习工具提供的 API指定 1.1 Tesorflow tensroflow指定GPU的多卡并行的时候,也是可以 ...
- 5.openldap设置用户本身修改密码
1. 修改slapd.conf文件 #vim /etc/openldap/slapd.conf 修改下如下内容 access to dn.subtree="ou=People,dc=bawo ...
- 大学网站UI设计分析(以学校领导/历届领导为例)
第一次的冲刺阶段让我过了一把PM的瘾,第一阶段的冲刺完成以后第一感觉就是PM不好当,在大学里做个课程设计当个PM相对而言还是比较容易的,但是我明白,当我们走向工作岗位以后,面临的情况会比学校的情况的复 ...
- mininet实验 脚本实现控制交换机行为
写在前面 本文参考 通过这个实验,我学习到了另一种下流表的方式. 下流表有两种方式(我目前了解): 通过controller下发. 通过OvS提供的API直接向OvS交换机下流表. 本实验脚本已经把相 ...