#2024. 「JLOI / SHOI2016」侦查守卫

 

题目描述

小 R 和 B 神正在玩一款游戏。这款游戏的地图由 nnn 个点和 n−1n - 1n−1 条无向边组成,每条无向边连接两个点,且地图是连通的。换句话说,游戏的地图是一棵有 nnn 个节点的树。

游戏中有一种道具叫做侦查守卫,当一名玩家在一个点上放置侦查守卫后,它可以监视这个点以及与这个点的距离在 ddd 以内的所有点。这里两个点之间的距离定义为它们在树上的距离,也就是两个点之间唯一的简单路径上所经过边的条数。

在一个点上放置侦查守卫需要付出一定的代价,在不同点放置守卫的代价可能不同。现在小 R 知道了所有 B 神可能出现的位置,请你计算监视所有这些位置的最小代价。

输入格式

第一行包含两个正整数 nnn 和 ddd,分别表示地图上的点数和侦查守卫的视野范围。约定地图上的点用 111 到 nnn 的正整数编号。
第二行包含 nnn 个正整数,第 iii 个正整数表示在编号为 iii 的点放置侦查守卫的代价 wiw_iw​i​​。保证 wi≤1000w_i \leq 1000w​i​​≤1000。
第三行包含一个正整数 mmm,表示 B 神可能出现的点的数量。保证 m≤nm \leq nm≤n。
第四行包含mmm 个正整数,分别表示每个 B 神可能出现的点的编号,从小到大不重复地给出。
接下来 n−1n - 1n−1 行,每行包含两个整数 u,vu, vu,v,表示在编号为 uuu 的点和编号为 vvv 的点之间有一条无向边。

输出格式

输出一行一个整数,表示监视所有 B 神可能出现的点所需要的最小代价。

样例

样例输入

  1. 12 2
  2. 8 9 12 6 1 1 5 1 4 8 10 6
  3. 10
  4. 1 2 3 5 6 7 8 9 10 11
  5. 1 3
  6. 2 3
  7. 3 4
  8. 4 5
  9. 4 6
  10. 4 7
  11. 7 8
  12. 8 9
  13. 9 10
  14. 10 11
  15. 11 12

样例输出

  1. 10

数据范围与提示

Case # nnn ddd 附加限制
1 ≤20\leq 20≤20 ≤5\leq 5≤5 -
2, 3 ≤500000\leq 500\,000≤500000 =1= 1=1 -
4, 5 ≤500000\leq 500\,000≤500000 ≤20\leq 20≤20 n=mn = mn=m
6, 7, 8 ≤10000\leq 10\,000≤10000 ≤20\leq 20≤20 -
9, 10 ≤500000\leq 500\,000≤500000 ≤20\leq 20≤20 -
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define INF 1000000000
  5. #define maxn 500010
  6. using namespace std;
  7. int head[maxn],w[maxn],up[maxn][],down[maxn][],mark[maxn],h[maxn];
  8. int n,m,d,num;
  9. struct node{int to,pre;}e[maxn*];
  10. void Insert(int from,int to){
  11. e[++num].to=to;
  12. e[num].pre=head[from];
  13. head[from]=num;
  14. }
  15. void dfs(int x,int father){
  16. if(mark[x])down[x][]=up[x][]=w[x];
  17. for(int i=;i<=d;i++)up[x][i]=w[x];
  18. up[x][d+]=INF;
  19. for(int i=head[x];i;i=e[i].pre){
  20. int to=e[i].to;
  21. if(to==father)continue;
  22. dfs(to,x);
  23. for(int j=d;j>=;j--){
  24. up[x][j]=min(up[x][j]+down[to][j],down[x][j+]+up[to][j+]);
  25. up[x][j]=min(up[x][j],up[x][j+]);
  26. }
  27. down[x][]=up[x][];
  28. for(int j=;j<=d+;j++)down[x][j]+=down[to][j-];
  29. for(int j=;j<=d;j++)down[x][j+]=min(down[x][j+],down[x][j]);
  30. }
  31. }
  32. int main(){
  33. scanf("%d%d",&n,&d);
  34. for(int i=;i<=n;i++)scanf("%d",&w[i]);
  35. scanf("%d",&m);
  36. int x,y;
  37. for(int i=;i<=m;i++){
  38. scanf("%d",&x);
  39. mark[x]=;
  40. }
  41. for(int i=;i<n;i++){
  42. scanf("%d%d",&x,&y);
  43. Insert(x,y);Insert(y,x);
  44. }
  45. dfs(,);
  46. printf("%d",down[][]);
  47. return ;
  48. }

loj #2024. 「JLOI / SHOI2016」侦查守卫的更多相关文章

  1. 【LOJ】#2024. 「JLOI / SHOI2016」侦查守卫

    题解 童年的回忆! 想当初,这是我考的第一次省选,我当时初二,我什么都不会,然后看着这个东西,是不是能用我一个月前才会的求lca,光这个lca我就调了一个多小时= =,然后整场五个小时,我觉得其他题不 ...

  2. loj2024「JLOI / SHOI2016」侦查守卫

    too hard #include <iostream> #include <cstdio> using namespace std; int n, d, m, uu, vv, ...

  3. loj #2026. 「JLOI / SHOI2016」成绩比较

    #2026. 「JLOI / SHOI2016」成绩比较   题目描述 THU 的 G 系中有许许多多的大牛,比如小 R 的室友 B 神.B 神已经厌倦了与其他的同学比较 GPA(Grade Poin ...

  4. loj #2025. 「JLOI / SHOI2016」方

    #2025. 「JLOI / SHOI2016」方   题目描述 上帝说,不要圆,要方,于是便有了这道题. 由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形.上帝把我们派到了一个有 NNN ...

  5. LOJ #2026「JLOI / SHOI2016」成绩比较

    很好的锻炼推柿子能力的题目 LOJ #2026 题意 有$n$个人$ m$门学科,第$ i$门的分数为不大于$U_i$的一个正整数 定义A「打爆」B当且仅当A的每门学科的分数都不低于B的该门学科的分数 ...

  6. 【LOJ】 #2025. 「JLOI / SHOI2016」方

    题解 有什么LNOI啊,最后都是JLOI罢了 一道非常--懵逼的统计题 当然是容斥,所有的方案 - 至少有一个点坏掉的正方形 + 至少有两个点坏掉的正方形 - 至少有三个点坏掉的正方形 + 至少有四个 ...

  7. 【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] \* ...

  8. loj2026 「JLOI / SHOI2016」成绩比较

    orz #include <iostream> #include <cstdio> using namespace std; typedef long long ll; int ...

  9. Loj #2495. 「AHOI / HNOI2018」转盘

    Loj #2495. 「AHOI / HNOI2018」转盘 题目描述 一次小 G 和小 H 原本准备去聚餐,但由于太麻烦了于是题面简化如下: 一个转盘上有摆成一圈的 \(n\) 个物品(编号 \(1 ...

随机推荐

  1. ORACLE显式授权

    同一数据库 两个不同用户 user1 user2 user1里面有一张表 table1 在user2里面创建synonymcreate synonym sy1 for user1.table1; 创建 ...

  2. 机器学习:模型泛化(L1、L2 和弹性网络)

    一.岭回归和 LASSO 回归的推导过程 1)岭回归和LASSO回归都是解决模型训练过程中的过拟合问题 具体操作:在原始的损失函数后添加正则项,来尽量的减小模型学习到的 θ 的大小,使得模型的泛化能力 ...

  3. &(((struct A*)NULL)->m_float)---offsetof

    问题描述: struct A { int m_int; float m_float; }; int main(void) { printf("%p",&(((struct ...

  4. 基于RFC5321使用ncat发送邮件

    今天和同事学习到的这个方法,学习了,记录一下: [root@localhost ~]# ncat TeamServer.localdomain ESMTP Postfix EHLO l00.win - ...

  5. java反射专题二

    一丶Class中常用方法详解 1)getFields() 只能获取到运行时类中及其父类中声明为public的属性 2)getDeclaredFields() 获取运行时类本身声明的所有属性 3)get ...

  6. DAY11-MYSQL视图、触发器、事务、存储过程、函数

    一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  7. Synchronized关键字、Lock,并解释它们之间的区别

    Synchronized 与Lock都是可重入锁,同一个线程再次进入同步代码的时候.可以使用自己已经获取到的锁. Synchronized是悲观锁机制,独占锁.而Locks.ReentrantLock ...

  8. js-tree坑

    今天遇到一个js坑,一个页面,有两棵树,用同一个套参数初始化的,,,,当选择完另一个棵树之后,再操作另一颗树,不选择树节点,就会有错误出现,,,

  9. [CSS Hack]解決IE6、IE7、IE8、Firefox的瀏覽器相容性問題!

    每次調CSS最令人頭痛的就是瀏覽器校正問題,因為每個瀏覽器對CSS的解釋都不太一樣,Firefox本身算是比較照規矩來,處理上比較簡單,但是遇到微軟的IE系列頭就大了,雖然都是IE,但是IE6.IE7 ...

  10. ListView的ScrollListener

    @Override public void onScrollStateChanged(AbsListView paramAbsListView, int paramInt) { //当屏幕停止滚动时为 ...