树形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 士兵的放置的更多相关文章

  1. bzoj2314: 士兵的放置(树形DP)

    0表示被父亲控制,1表示被儿子控制,2表示被自己控制.f表示最少士兵数,g表示方案数. 转移贼难写,写了好久之后写不下去了,看了一眼题解,学习了...原来还可以这么搞 比如求f[i][1]的时候,要在 ...

  2. 【BZOJ2314】士兵的放置 树形DP

    [BZOJ2314]士兵的放置 Description 八中有N个房间和N-1双向通道,任意两个房间均可到达.现在出了一件极BT的事,就是八中开始闹鬼了.老大决定加强安保,现在如果在某个房间中放一个士 ...

  3. BZOJ 2314: 士兵的放置( 树形dp )

    树形dp... dp(x, 0)表示结点x不放士兵, 由父亲控制: dp(x, 1)表示结点x不放士兵, 由儿子控制: dp(x, 2)表示结点x放士兵. ---------------------- ...

  4. BZOJ 2314 士兵的放置(支配集)

    显然是\(DP\). 设\(dp[i][0/1/2]\)代表以i为根且\(i上有士兵放置/i被控制但i上没有士兵/i没有被控制\)的最小代价. \(g[i][0/1/2]\)代表对应的方案数. 然后运 ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. 【BZOJ-1458】士兵占领 最大流

    1458: 士兵占领 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 782  Solved: 456[Submit][Status][Discuss] ...

  7. bzoj1458 士兵占领

    费用流,连下面几类边 1.s->s',流量为n*m,费用为0,表示最多可放置n*m个士兵 2.s'->行 (1)流量为a[i],费用为-n*m,表示必须在这一行放置a[i]个士兵. (2) ...

  8. 【BZOJ】1458: 士兵占领(上下界网络流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1458 是不是我脑洞太小了.......直接弄上下界最小流........(就当复习了.. 二分图X和 ...

  9. 1458: 士兵占领 - BZOJ

    Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放 ...

随机推荐

  1. type="submit"

    <?php var_dump($_REQUEST); ?> <form action="" id="javascript_page"> ...

  2. 2.wireshark分析之TCP协议(一)

    (1) TCP是怎么样的协议? TCP是一种面向连接(连接导向)的.可靠的基于字节流的传输层通信协议.TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认.对失序的数据重新排 ...

  3. Python网络爬虫学习总结

    1.检查robots.txt 让爬虫了解爬取该网站时存在哪些限制. 最小化爬虫被封禁的可能,而且还能发现和网站结构相关的线索. 2.检查网站地图(robots.txt文件中发现的Sitemap文件) ...

  4. kubernetes实战(五):k8s持久化安装Redis Sentinel

    1.PV创建 在nfs或者其他类型后端存储创建pv,首先创建共享目录 [root@nfs ~]# cat /etc/exports /k8s/redis-sentinel/ *(rw,sync,no_ ...

  5. 一个Spark job的生命历程

    一个job的生命历程 dagScheduler.runJob //(1) --> submitJob ( eventProcessLoop.post(JobSubmitted,***) //(2 ...

  6. 线程,协程,IO模型

    理论: 1.每创造一个进程,默认里面就有一个线程 2.进程是一个资源单位,而进程里面的线程才是CPU上的一个调度单位 3.一个进程里面的多个线程,是共享这个进程里面的资源的 4.线程创建的开销比进程要 ...

  7. Cannot find entry file index.android.js in any of the roots:[ Android ]

    Changed the version of react project to a lower one from here npm install -g rninit rninit init [Pro ...

  8. c++11 类默认函数的控制:"=default" 和 "=delete"函数 void fun() = default; void fun()=delete;

    转自:lsgxeva #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #includ ...

  9. 工作记录之开发HRM项目总结

    开发HRM项目的步骤: 1:首先保留HRM项目中的两张表(Employee,Position)把这两张表中的数据内容复制到Operator-Portlet这个项目中,这两张表的service.xml配 ...

  10. SQL面试题及答案

    我觉得里面有些答案是不正确的,请只作参考 Student(S#,Sname,Sage,Ssex) 学生表       S#:学号:Sname:学生姓名:Sage:学生年龄:Ssex:学生性别 Cour ...