题目链接

原题解:

考虑我们需要的信息:子树里最浅的一个能向上的点是谁?子树里最深的一个没被覆盖的深度是多少?

我们记录一下$f_{i,a,b}$表示上面两个信息为$a$和$b$的时候,最少要花费的代价。

转移的时候枚举$c,d$进行转移,看起来就很麻烦。

然后我们注意一个结论:考虑如果$a\geq b$的话,这个$b$其实是$0$,而如果$a<b$的话,证明之后存在一个节点$x$,到$i$之后剩余能覆盖的距离至少是$b$,所以$a$和$b$中一定有一个信息是没用的。

我们令$f_{i,a}$表示存在一个还能覆盖是$a$的点,$g_{i,b}$表示存在一个深度为$b$的还没覆盖的点。

考虑暴力转移,可以通过前缀和优化直接做到$O(NK)$。

补充:

从找到“有用信息”这一步我就被拒之门外了。。。

然后“有用信息”之间也是有相互影响的关系的。搞清楚本质有助于优化DP。

代码(100分):

#include<cstdio>
#include<cstring>
#define K 202
#define M 200002
#define N 100001
inline int min(int x,int y){return x<y?x:y;}
int a[N],b[M],c[M],e[N],f[N][K],g[K],m,n;
void dfs(int u,int v)
{
for(int i=0;i<=m;i++)f[u][i]=1000000000;
for(int&i=a[u];i;i=b[i])if(c[i]!=v)
{
dfs(c[i],u);
for(int j=0;j<m;j++)g[j+1]=min(g[j+1],f[c[i]][j]+f[u][m+m-j]);
for(int j=m;j<=m<<1;j++)g[m+m-j]=min(g[m+m-j],f[c[i]][j]+f[u][m+m-j]);
for(int j=m;j<=m<<1;j++)g[j+1]=f[c[i]][j]+f[u][j+1];
for(int j=1;j<=(m<<1|1);j++)f[u][j]=min(f[u][j-1],g[j]),g[j]=1000000000;
}
for(int i=0;f[u][m<<1|1]+e[u]<f[u][i];i++)f[u][i]=f[u][m<<1|1]+e[u];
}
int i,u,v;
int main()
{
for(scanf("%d%d",&n,&m),i=1;i<=(m<<1|1);i++)g[i]=1000000000;
for(i=1;i<=n;i++)scanf("%d",e+i);
for(i=1;i<n;i++)scanf("%d%d",&u,&v),b[i<<1]=a[u],c[a[u]=i<<1]=v,b[i<<1|1]=a[v],c[a[v]=i<<1|1]=u;
return 0&(dfs(1,0),printf("%d\n",f[1][m]));
}

【2020NOI.AC省选模拟#6】A. zyb的监控计划的更多相关文章

  1. NOI.AC省选模拟赛第一场 T1 (树上高斯消元)

    link 很容易对于每个点列出式子 \(f_{x,y}=(f_{x,y-1}+f_{x,y}+f_{x,y+1}+f_{x+1,y})/4\)(边角转移类似,略) 这个转移是相互依赖的就gg了 不过你 ...

  2. [NOI.AC省选模拟赛3.31] 星辰大海 [半平面交]

    题面 传送门 思路 懒得解释了......也是比较简单的结论 但是自己看到几何就退缩了...... 下周之内写一个计算几何的学习笔记! Code #include<iostream> #i ...

  3. [NOI.AC省选模拟赛3.31] 附耳而至 [平面图+最小割]

    题面 传送门 思路 其实就是很明显的平面图模型. 不咕咕咕的平面图学习笔记 用最左转线求出对偶图的点,以及原图中每个边两侧的点是谁 建立网络流图: 源点连接至每一个对偶图点,权值为这个区域的光明能量 ...

  4. [NOI.AC省选模拟赛3.30] Mas的童年 [二进制乱搞]

    题面 传送门 思路 这题其实蛮好想的......就是我考试的时候zz了,一直没有想到标记过的可以不再标记,总复杂度是$O(n)$ 首先我们求个前缀和,那么$ans_i=max(pre[j]+pre[i ...

  5. [NOI.AC省选模拟赛3.23] 染色 [点分治+BFS序]

    题面 传送门 重要思想 真的是没想到,我很久以来一直以为总会有应用的$BFS$序,最终居然是以这种方式出现在题目中 笔记:$BFS$序可以用来处理限制点对距离的题目(综合点分树使用) 思路 本题中首先 ...

  6. [NOI.AC省选模拟赛3.23] 集合 [数学]

    题面 传送门 一句话题意: 给定$n\leq 1e9,k\leq 1e7,T\leq 1e9$ 设全集$U=\lbrace 1,2,3,...n\rbrace $,求$(min_{x\in S}\lb ...

  7. [noi.ac省选模拟赛]第12场题解集合

    题目 比赛界面. T1 数据范围明示直接\(O(n^2)\)计算,问题就在如何快速计算. 树上路径统计通常会用到差分方法.这里有两棵树,因此我们可以做"差分套差分",在 A 树上对 ...

  8. [noi.ac省选模拟赛]第10场题解集合

    题目 比赛界面. T1 不难想到,对于一个与\(k\)根棍子连接的轨道,我们可以将它拆分成\(k+1\)个点,表示这条轨道不同的\(k+1\)段. 那么,棍子就成为了点与点之间的边.可以发现,按照棍子 ...

  9. [noi.ac省选模拟赛]第11场题解集合

    题目   比赛界面. T1   比较简单.容易想到是求鱼竿的最大独立集.由于题目的鱼竿可以被分割为二分图,就可以想到最大匹配.   尝试建边之后会发现边的数量不小,但联系题目性质会发现对于一条鱼竿,它 ...

  10. [noi.ac省选模拟赛20200606]赌怪

    题目   点这里看题目. 分析   先特判掉\(K=2\)的情况.   首先可以考虑到一个简单 DP :   \(f(i)\):前\(i\)张牌的最大贡献.   转移可以\(O(n^2)\)地枚举区间 ...

随机推荐

  1. 计算机视觉——SSD和YOLO简介

    前言 本文记录用,防止遗忘 计算机视觉--SSD和YOLO简介 课件(单发多框检测SSD) 生成锚框 对每个像素,生成多个以它为中心的锚框 给定n个大小 s1, ...,s2,和m个高宽比,那么生成 ...

  2. [2015年NOIP提高组] 跳石头

    一年一度的"跳石头"比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 <spa ...

  3. IIS7无法访问.apk文件的解决方法

    随着智能手机的普及,越来越多的人使用手机上网,很多网站也应手机上网的需要推出了网站客户端,.apk文件就是安卓(Android)的应用程序后缀名,默认情况下,使用IIS作为Web服务器的无法访问下载此 ...

  4. Markdowm的下载方法

    1打开百度搜索,输入TYPORA打开下载页面,根据自己的系统(我的是WINDOWS64位)点"DOWN"进行下载安装. 2安装好后回到桌面新建一个文件夹(Markdown学习),然 ...

  5. string中的stoi()函数

    1094 谷歌的招聘 (20分) 本题要求你编程解决一个更通用的问题:从任一给定的长度为 L 的数字中,找出最早出现的 K 位连续数字所组成的素数. 输入格式: 输入在第一行给出 2 个正整数,分别是 ...

  6. 004 jmeter断言、集合点、函数、分布式

    1.断言 *定义:断言就是让程序代替人工去判断程序响应数据是否达到预期结果. *断言可以检查返回数据的正确性与完整性 *常见的断言 *响应断言(断言状态码+断言文本值)哪个接口需要断言就在哪一个接口后 ...

  7. Android学习——控件Notification

    1.创建Notification和NotificationManager 2.NotificationChannel 3.常用方法说明

  8. Redux Toolkit——基操

    redux-toolkit是redux的升级版 安装 npm install @reduxjs/toolkit // 在react中还需要搭配react-redux使用 npm install rea ...

  9. Qt 程序主界面添加背景图片

    1.开发环境:Qt5.12.2,QtCreate4.8.2 2.贴图代码,在主程序中编写 #include <QImageReader> int main(int argc, char * ...

  10. xorg 屏幕分辨率设置(x11分辨率设置/linux分辨率设置)

    记录一下,用于linux虚拟机分辨率设置.https://blog.csdn.net/weixin_36084095/article/details/116839103(在谷歌搜索是简书的文章,在百度 ...