【LOJ】#2024. 「JLOI / SHOI2016」侦查守卫
题解
童年的回忆!
想当初,这是我考的第一次省选,我当时初二,我什么都不会,然后看着这个东西,是不是能用我一个月前才会的求lca,光这个lca我就调了一个多小时= =,然后整场五个小时,我觉得其他题不可做,一直杠这题的20分,然后。。。day1爆零了,之后day2手玩提答好像骗了一点,总归是没爆零
那么这个东西是可爱的树dp啦
首先我们考虑m = n(因为大体的代码都需要这个思路吧
我们设\(f[u][d]\)是u这个点不包括u,可以继续往上覆盖d个点最少需要的代价
\(g[u][d]\)是u这个点包括u自己还需要往下覆盖d个点最少需要的代价(和f有点开闭区间的意味哦,但是方便转移,g是闭区间,f是开区间
转移枚举u的儿子
\(f[u][d] = min(f[u][d],\sum_{v \in Son_u} f[v][d + 1] + \sum_{t = otherson}g[t][d])\)
\(g[u][d] = \sum_{v \in Son_u}g[v][d - 1]\)
\(g[u][ 0 ] = min(g[u][ 0 ],f[u][ 0 ])\)
如果选择某个点的话
\(f[u][d] = w[u] + \sum_{v \in Son_u} g[v][d]\)
我们还有一点,就是在计算完g数组和f数组后,要分别处理成g是前缀最小值,f是后缀最小值
可以这么想\(g[u][d - 1]\)能达到的最小值,\(g[u][d]\)也要能达到啊,显然我多覆盖一点,答案不会受影响
\(f[u][d + 1]\)能达到的最小值,\(f[u][d]\)也要能达到啊,显然我少覆盖一点,答案不会受影响
好的,我们刚才说的只是m = n的情况
如果不是,就证明有的点可以不覆盖,那么这么考虑,就是子树该覆盖的都需要被覆盖,自己不用被覆盖
那么就让\(f[u][ 0 ]\)的初始值为
\(f[u][ 0 ] = \sum_{v \in Son_u}g[v][ 0 ]\)
最后全部dp完成后答案就是\(f[1][ 0 ]\)
代码
#include <bits/stdc++.h>
#define MAXN 500005
//#define ivorysi
using namespace std;
typedef long long int64;
struct node {
int to,next;
}edge[MAXN * 2];
int head[MAXN],sumedge;
int n,d;
int f[MAXN][21],g[MAXN][21],w[MAXN];
bool appear[MAXN];
void add(int u,int v) {
edge[++sumedge].to = v;
edge[sumedge].next = head[u];
head[u] = sumedge;
}
void addtwo(int u,int v) {
add(u,v);add(v,u);
}
void dp(int u,int fa) {
for(int i = 0 ; i <= d ; ++i) g[u][i] = 0x7fffffff;
for(int i = 0 ; i <= d ; ++i) f[u][i] = 0x7fffffff;
vector<int> s;
for(int i = head[u] ; i ; i = edge[i].next) {
int v = edge[i].to;
if(v != fa) {
dp(v,u);
s.push_back(v);
}
}
if(!appear[u]) {
f[u][0] = 0;
for(auto v : s) {
f[u][0] += g[v][0];
}
}
for(int i = 0 ; i <= d; ++i) {
if(i != d) {
int sum = 0;
for(auto v : s) sum += g[v][i];
for(auto v : s) {
f[u][i] = min(f[u][i],f[v][i + 1] + sum - g[v][i]);
}
}
if(i != 0) {
g[u][i] = 0;
for(auto v : s) g[u][i] += g[v][i - 1];
}
}
f[u][d] = w[u];
for(auto v : s) {
f[u][d] += g[v][d];
}
for(int i = d - 1 ; i >= 0 ; --i) {
f[u][i] = min(f[u][i + 1],f[u][i]);
}
g[u][0] = min(g[u][0],f[u][0]);
for(int i = 1 ; i <= d ; ++i) {
g[u][i] = min(g[u][i],g[u][i - 1]);
}
s.clear();
}
void Init() {
scanf("%d%d",&n,&d);
for(int i = 1 ; i <= n ; ++i) scanf("%d",&w[i]);
int m,u,v;
scanf("%d",&m);
for(int i = 1 ; i <= m ; ++i) {
scanf("%d",&u);
appear[u] = 1;
}
for(int i = 1 ; i < n ; ++i) {
scanf("%d%d",&u,&v);
addtwo(u,v);
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
dp(1,0);
printf("%d\n",f[1][0]);
}
【LOJ】#2024. 「JLOI / SHOI2016」侦查守卫的更多相关文章
- loj #2024. 「JLOI / SHOI2016」侦查守卫
#2024. 「JLOI / SHOI2016」侦查守卫 题目描述 小 R 和 B 神正在玩一款游戏.这款游戏的地图由 nnn 个点和 n−1n - 1n−1 条无向边组成,每条无向边连接两个点, ...
- loj2024「JLOI / SHOI2016」侦查守卫
too hard #include <iostream> #include <cstdio> using namespace std; int n, d, m, uu, vv, ...
- loj #2026. 「JLOI / SHOI2016」成绩比较
#2026. 「JLOI / SHOI2016」成绩比较 题目描述 THU 的 G 系中有许许多多的大牛,比如小 R 的室友 B 神.B 神已经厌倦了与其他的同学比较 GPA(Grade Poin ...
- loj #2025. 「JLOI / SHOI2016」方
#2025. 「JLOI / SHOI2016」方 题目描述 上帝说,不要圆,要方,于是便有了这道题. 由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形.上帝把我们派到了一个有 NNN ...
- LOJ #2026「JLOI / SHOI2016」成绩比较
很好的锻炼推柿子能力的题目 LOJ #2026 题意 有$n$个人$ m$门学科,第$ i$门的分数为不大于$U_i$的一个正整数 定义A「打爆」B当且仅当A的每门学科的分数都不低于B的该门学科的分数 ...
- 【LOJ】 #2025. 「JLOI / SHOI2016」方
题解 有什么LNOI啊,最后都是JLOI罢了 一道非常--懵逼的统计题 当然是容斥,所有的方案 - 至少有一个点坏掉的正方形 + 至少有两个点坏掉的正方形 - 至少有三个点坏掉的正方形 + 至少有四个 ...
- 【LOJ】#2026. 「JLOI / SHOI2016」成绩比较
题解 用\(f[i][j]\)表示考虑了前i个排名有j个人被碾压 \(f[i][j] = f[i - 1][k] \* C[k][j] \* C[N - k - 1][N - r[i] - j] \* ...
- loj2026 「JLOI / SHOI2016」成绩比较
orz #include <iostream> #include <cstdio> using namespace std; typedef long long ll; int ...
- Loj #2495. 「AHOI / HNOI2018」转盘
Loj #2495. 「AHOI / HNOI2018」转盘 题目描述 一次小 G 和小 H 原本准备去聚餐,但由于太麻烦了于是题面简化如下: 一个转盘上有摆成一圈的 \(n\) 个物品(编号 \(1 ...
随机推荐
- python 多线程中的同步锁 Lock Rlock Semaphore Event Conditio
摘要:在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供Lo ...
- TCP、UDP绑定同一端口通信的解释
昨日突然讨论起TCP与UDP是否可以在同一端口进行绑定,通信. 在印象当中我记得是可以的,今日google了相关资料, 确定以及肯定的: TCP.UDP可以绑定同一端口来进行通信: 网络中可以被命名和 ...
- SVN 使用笔记
SVN中检出 和 导出 的区别 检出得到的文件夹中,是受SVN客户端控制的,对其进行文件或文件夹的增删改操作都会被SVN客户端识别出来,对其可以进行update.commit操作.其中含有.svn隐藏 ...
- 同一个IIS绑定多个Htts 站点问题
默认情况一个服务器的IIS只能绑定一个HTTPS也就是443端口 要实现多个站点对应HTTPS只能更改IIS配置 地址:C:Windowssystem32inetsrvconfigapplicatio ...
- 使iis支持asp.net扩展
打开控制面板 - 程序和功能,点击左边 “打开或关闭 Windows 功能”. 在弹出的对话框中,展开 “Internet信息服务”,展开“万维网服务”,展开“应用程序开发功能”,勾选“ASP”和“A ...
- Linux IO模型
1. Linux IO 模型矩阵 2. 同步阻塞IO 3. 同步非阻塞IO 4. 异步阻塞IO 5. 异步非阻塞IO
- Ubuntu 13.04 主机名的修改
由于某些原因,要修改Ubuntu的主机名,晚上Google了一下,要改的地方为/etc/hostname,即将里面的字符串替换为你要起的主机名即可. sudo vi /etc/hostname 修改即 ...
- Linux查看日志三种命令
第一种:查看实时变化的日志(比较吃内存) 最常用的: tail -f filename (默认最后10行,相当于增加参数 -n 10) Ctrl+c 是退出tail命令 其他情况: tail -n ...
- Python概念-反射之文化底蕴版:反正射了
什么是反射 光在两种物质分界面上改变传播方向又返回原来物质中的现象,叫反射! 以上,是反射的物理定义,与python中的反射概念,完全没有任何关系 书归正传:反射 就是通过字符串的形式,操作对象相关的 ...
- 工具推荐:ATSCAN,功能强大的Perl脚本扫描器
工具推荐:ATSCAN,功能强大的Perl脚本扫描器 使用perl语言编写的开源的扫描器,功能丰富强大,除了基本的tcp和udp端口扫描之外,还可以搜索wordpress.joomla等网站并进行口令 ...