BZOJ2314 士兵的放置
树形DP,恩然后就不会了。。。
先写了个错的离谱程序。。。果然WA了
然后开始乱搞,欸,对了!
令f[i], g[i], h[i]分别表示i号节点自己放士兵,被儿子上的士兵控制,不被儿子上的士兵控制但被父亲上的士兵控制的情况下,以i为子树中最少的士兵数
F[i], G[i], H[i]表示对应的方案数,然后这方程写的沁人心脾。。。看程序吧
/**************************************************************
Problem: 2314
User: rausen
Language: C++
Result: Accepted
Time:3224 ms
Memory:99512 kb
****************************************************************/ #include <cstdio>
#include <algorithm> using namespace std;
typedef long long ll;
const int N = 5e5 + ;
const int inf = 1e9;
const int mod = ;
const int Maxlen = N * ; struct edge {
int next, to;
edge() {}
edge(int _n, int _t) : next(_n), to(_t) {}
} e[N << ]; int n;
int first[N], tot;
ll f[N], g[N], h[N];
ll F[N], G[N], H[N];
ll ans;
bool vis[N];
char buf[Maxlen], *c = buf;
int Len; inline int read() {
int x = ;
while (*c < '' || '' < *c) ++c;
while ('' <= *c && *c <= '')
x = x * + *c - '', ++c;
return x;
} inline void Add_Edges(int x, int y) {
e[++tot] = edge(first[x], y), first[x] = tot;
e[++tot] = edge(first[y], x), first[y] = tot;
} #define y e[x].to
void dfs(int p) {
int x, mn;
ll t;
vis[p] = ;
f[p] = , g[p] = inf, h[p] = ;
F[p] = G[p] = H[p] = ;
for (x = first[p]; x; x = e[x].next)
if (!vis[y]) {
dfs(y); mn = min(min(f[y], g[y]), h[y]), t = ;
if (f[y] == mn) t += F[y];
if (g[y] == mn) t += G[y];
if (h[y] == mn) t += H[y];
f[p] += mn, (F[p] *= t) %= mod; mn = min(min(g[p] + f[y], g[p] + g[y]), h[p] + f[y]), t = ;
if (g[p] + f[y] == mn) t += G[p] * F[y];
if (g[p] + g[y] == mn) t += G[p] * G[y];
if (h[p] + f[y] == mn) t += H[p] * F[y];
g[p] = mn, G[p] = t % mod; h[p] += g[y], (H[p] *= G[y]) %= mod;
}
}
#undef y int main() {
Len = fread(c, , Maxlen, stdin);
buf[Len] = '\0';
int i, x, y;
n = read();
for (i = ; i < n; ++i) {
x = read(), y = read();
Add_Edges(x, y);
}
dfs();
printf("%lld\n", min(f[], g[]));
printf("%lld\n", f[] == g[] ? (F[] + G[]) % mod : f[] < g[] ? F[] : G[]);
return ;
}
BZOJ2314 士兵的放置的更多相关文章
- bzoj2314: 士兵的放置(树形DP)
0表示被父亲控制,1表示被儿子控制,2表示被自己控制.f表示最少士兵数,g表示方案数. 转移贼难写,写了好久之后写不下去了,看了一眼题解,学习了...原来还可以这么搞 比如求f[i][1]的时候,要在 ...
- 【BZOJ2314】士兵的放置 树形DP
[BZOJ2314]士兵的放置 Description 八中有N个房间和N-1双向通道,任意两个房间均可到达.现在出了一件极BT的事,就是八中开始闹鬼了.老大决定加强安保,现在如果在某个房间中放一个士 ...
- BZOJ 2314: 士兵的放置( 树形dp )
树形dp... dp(x, 0)表示结点x不放士兵, 由父亲控制: dp(x, 1)表示结点x不放士兵, 由儿子控制: dp(x, 2)表示结点x放士兵. ---------------------- ...
- BZOJ 2314 士兵的放置(支配集)
显然是\(DP\). 设\(dp[i][0/1/2]\)代表以i为根且\(i上有士兵放置/i被控制但i上没有士兵/i没有被控制\)的最小代价. \(g[i][0/1/2]\)代表对应的方案数. 然后运 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 【BZOJ-1458】士兵占领 最大流
1458: 士兵占领 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 782 Solved: 456[Submit][Status][Discuss] ...
- bzoj1458 士兵占领
费用流,连下面几类边 1.s->s',流量为n*m,费用为0,表示最多可放置n*m个士兵 2.s'->行 (1)流量为a[i],费用为-n*m,表示必须在这一行放置a[i]个士兵. (2) ...
- 【BZOJ】1458: 士兵占领(上下界网络流)
http://www.lydsy.com/JudgeOnline/problem.php?id=1458 是不是我脑洞太小了.......直接弄上下界最小流........(就当复习了.. 二分图X和 ...
- 1458: 士兵占领 - BZOJ
Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放 ...
随机推荐
- MTA---smtp(25,postfix,sendmail),Pop3(110,Devocot), MUA(foxmail) IMAP(server,client rsync)
利用telnet进行SMTP的验证 =========先计算BASE64编码的用户名密码,认证登录需要用到=========== [crazywill@localhost crazywill]$ pe ...
- 比特币BTC全节点搭建
比特币BTC全节点搭建 #环境 ubuntu 16.4 #硬盘500GB #截止2018-12-31磁盘占用超过230GB #客户端安装 #下载页面 #https://bitcoin.org/zh_C ...
- centos 邮件服务 腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25 收邮件协议:pop3 端口110 iredmail安装配置 使用邮箱系统 第三十一节课
centos 邮件服务 腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25 收邮件协议:pop3 端口110 iredmail安装配置 ...
- (转)利用Spring AOP自定义注解解决日志和签名校验
一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...
- 上传文件小的oK,大一点的传不了,显示 (failed) net::ERR_CONNECTION_RESET
我很确定已经修改了php.ini中的文件上传限制,文件权限可写. 修改php.ini file_uploads = on ;是否允许通过HTTP上传文件的开关.默认为ON即是开 upload_tmp_ ...
- NiFi REST API 的使用
一.概述 为方便用户使用 NiFi 进行二次开发,NiFi 为开发者提供了 NIFI REST API. 关于 API 的详细介绍,请参见官网 NIFI REST API.这里仅给出一些注意的小细节. ...
- ACM-ICPC 2018 徐州赛区网络预赛 Solution
A. Hard to prepare 题意:有n个客人做成一圈,有$2^k$种面具,对于每种面具有一种面具不能使相邻的两个人戴,共有多少种做法. 思路: 把题意转化成相邻的人不能带同种面具.总数为$( ...
- 牛客国庆集训派对Day7 Solution
A Relic Discovery 水. #include <bits/stdc++.h> using namespace std; int t, n; int main() { s ...
- Linux 基础 —— Linux 进程的管理与监控
这篇文章主要讲 Linux 中进程的概念和进程的管理工具.原文:http://liaoph.com/inux-process-management/ 进程的概念 什么是进程 进程(Process)是计 ...
- uva11324 有向图的强连通分量+记忆化dp
给一张有向图G, 求一个结点数最大的结点集,使得该结点集中任意两个结点u和v满足,要么u可以到达v, 要么v可以到达u(u和v相互可达也可以). 因为整张图可能存在环路,所以不好使用dp直接做,先采用 ...