[JLOI2016]侦察守卫

[JLOI2016]侦察守卫

https://ac.nowcoder.com/acm/problem/20562

分析

比较奥秘重重的 状态设计。定义 为覆盖以 为根的全部子树,而且向上覆盖了 层节点。 表示,覆盖了以 为根,子树节点深度 的全部节点。

  • 初始化

    • 对于任何情况 。选择这个节点的转移。
    • 如果当前点是关键点,那么 。由于必须要覆盖这个节点,那么初始化为必选状态。
    • 如果当前点不是关键点,那么 。对于非关键点可以不选。
  • 转移

    • 定义,不解释。
    • ,当儿子转移到父亲,子树深度增加一。
    • ,这个其实是滚动数组,只要我们正序枚举就可以了。
    • 由于我们的转移只转移了端点,所以我们还要做一次前缀(后缀)最小值。

代码

#include<bits/stdc++.h>
using namespace std;
int read() {
    int x = 0,f = 0;char ch = getchar();
    while(!isdigit(ch)) {if(ch=='-')f=1;ch=getchar();}
    while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
    return f?-x:x;
}
const int N = 550000,inf = 1e9;
int f[N][22],g[N][22],vis[N],val[N],n,m,d;
struct Edge {int to,nxt;}e[N << 1];
int head[N],ecnt;
void add(int x,int y) {e[++ecnt]=(Edge){y,head[x]};head[x]=ecnt;}
void dfs(int x,int fa) {
    for(int i = 1;i <= d;i++) f[x][i] = val[x];
    if(vis[x]) f[x][0] = val[x];f[x][d + 1] = inf;
    g[x][0] = f[x][0];
    for(int i = head[x];i;i = e[i].nxt) {
        int y = e[i].to;
        if(y == fa) continue;
        dfs(y,x);
        for(int j = 0;j <= d;j++) f[x][j] = min(f[x][j] + g[y][j],f[y][j + 1] + g[x][j + 1]);
        for(int j = d;j >= 0;j--) f[x][j] = min(f[x][j],f[x][j + 1]);
        g[x][0] = f[x][0];
        for(int j = 1;j <= d;j++) g[x][j] += g[y][j - 1];
        for(int j = 1;j <= d;j++) g[x][j] = min(g[x][j],g[x][j - 1]);
    }
}
int main() {
    n = read();d = read();
    for(int i = 1;i <= n;i++) val[i] = read();
    m = read();
    for(int i = 1,a;i <= m;i++) a = read(),vis[a] = 1;
    for(int i = 1;i < n;i++) {
        int x = read(),y = read();
        add(x,y);add(y,x);
    }
    dfs(1,0);
    printf("%lld\n",f[1][0]); 
    return 0;
}
全部评论

相关推荐

评论
7
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
9672次浏览 89人参与
# 你的实习产出是真实的还是包装的? #
1742次浏览 40人参与
# 巨人网络春招 #
11304次浏览 223人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7453次浏览 43人参与
# 简历第一个项目做什么 #
31568次浏览 330人参与
# 重来一次,我还会选择这个专业吗 #
433352次浏览 3926人参与
# MiniMax求职进展汇总 #
23851次浏览 308人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186969次浏览 1122人参与
# 牛客AI文生图 #
21408次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152290次浏览 887人参与
# 研究所笔面经互助 #
118872次浏览 577人参与
# 简历中的项目经历要怎么写? #
310079次浏览 4194人参与
# AI时代,哪些岗位最容易被淘汰 #
63432次浏览 804人参与
# 面试紧张时你会有什么表现? #
30488次浏览 188人参与
# 你今年的平均薪资是多少? #
213009次浏览 1039人参与
# 你怎么看待AI面试 #
179861次浏览 1234人参与
# 高学历就一定能找到好工作吗? #
64313次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76436次浏览 374人参与
# 我的求职精神状态 #
447984次浏览 3128人参与
# 正在春招的你,也参与了去年秋招吗? #
363243次浏览 2637人参与
# 腾讯音乐求职进展汇总 #
160584次浏览 1111人参与
# 校招笔试 #
470425次浏览 2963人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务