http://www.lydsy.com/JudgeOnline/problem.php?id=2286

虚树上树形DP

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>using namespace std;#define N 250001typedef long long LL;int tot;int n,lim;
int front[N],to[N<<1],nxt[N<<1],val[N<<1];int Vfront[N],Vto[N],Vnxt[N];int id[N];int siz[N],bl[N],dep[N];int st[N],top;int mi[N],fa[N];int use[N];
bool imp[N];int tmp[N],cnt;void read(int &x)
{x=0; char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)) { x=x*10+c-'0';c=getchar();}
}void add(int u,int v,int w)
{to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; val[tot]=w;to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; val[tot]=w;
}void dfs1(int x)
{siz[x]=1;for(int i=front[x];i;i=nxt[i])if(to[i]!=fa[x]){fa[to[i]]=x;dep[to[i]]=dep[x]+1;mi[to[i]]=min(mi[x],val[i]);dfs1(to[i]);siz[x]+=siz[to[i]];}
}void dfs2(int x,int top)
{bl[x]=top;id[x]=++tot;int y=0;for(int i=front[x];i;i=nxt[i])if(to[i]!=fa[x] && siz[to[i]]>siz[y]) y=to[i];if(y) dfs2(y,top);else return;for(int i=front[x];i;i=nxt[i])if(to[i]!=fa[x] & to[i]!=y) dfs2(to[i],to[i]);
}int get_lca(int u,int v)
{while(bl[u]!=bl[v]){if(dep[bl[u]]<dep[bl[v]]) swap(u,v);u=fa[bl[u]];}return dep[u]<dep[v] ? u : v;
}void Vadd(int u,int v)
{Vto[++tot]=v; Vnxt[tot]=Vfront[u]; Vfront[u]=tot;
}bool cmp(int p,int q)
{return id[p]<id[q];
}void build(int m)
{tot=0;sort(use+1,use+m+1,cmp);st[top=1]=1;tmp[cnt=1]=1;int lca,x;for(int i=1;i<=m;++i){x=use[i];lca=get_lca(st[top],x);while(id[lca]<id[st[top]]){if(id[lca]>=id[st[top-1]]){Vadd(lca,st[top]);if(lca!=st[--top]) {st[++top]=lca;tmp[++cnt]=lca;}break;}Vadd(st[top-1],st[top]);top--;}st[++top]=x;tmp[++cnt]=x;    }while(top>1) {Vadd(st[top-1],st[top]); top--;}
}    LL DP(int x)
{LL s=0;for(int i=Vfront[x];i;i=Vnxt[i]) s+=DP(Vto[i]);if(!s || imp[x]) return mi[x];else if(x==1) return s;return min((LL)mi[x],s);
}int main()
{read(n);int u,v,w;for(int i=1;i<n;++i){read(u); read(v); read(w);add(u,v,w);}mi[1]=1e9;dfs1(1);tot=0;dfs2(1,1);int m;read(m);int k,x;while(m--){read(k);for(int i=1;i<=k;++i){read(x);use[i]=x;imp[x]=true;}build(k);cout<<DP(1)<<'\n';for(int i=1;i<=k;++i) imp[use[i]]=false;    for(int i=1;i<=cnt;++i) Vfront[tmp[i]]=0;}return 0;
}

2286: [Sdoi2011]消耗战

Time Limit: 20 Sec  Memory Limit: 512 MB
Submit: 4777  Solved: 1756
[Submit][Status][Discuss]

Description

在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达。现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望。已知在其他k个岛屿上有丰富能源,为了防止敌军获取能源,我军的任务是炸毁一些桥梁,使得敌军不能到达任何能源丰富的岛屿。由于不同桥梁的材质和结构不同,所以炸毁不同的桥梁有不同的代价,我军希望在满足目标的同时使得总代价最小。
侦查部门还发现,敌军有一台神秘机器。即使我军切断所有能源之后,他们也可以用那台机器。机器产生的效果不仅仅会修复所有我军炸毁的桥梁,而且会重新随机资源分布(但可以保证的是,资源不会分布到1号岛屿上)。不过侦查部门还发现了这台机器只能够使用m次,所以我们只需要把每次任务完成即可。

Input

第一行一个整数n,代表岛屿数量。

接下来n-1行,每行三个整数u,v,w,代表u号岛屿和v号岛屿由一条代价为c的桥梁直接相连,保证1<=u,v<=n且1<=c<=100000。

第n+1行,一个整数m,代表敌方机器能使用的次数。

接下来m行,每行一个整数ki,代表第i次后,有ki个岛屿资源丰富,接下来k个整数h1,h2,…hk,表示资源丰富岛屿的编号。

Output

输出有m行,分别代表每次任务的最小代价。

Sample Input

10
1 5 13
1 9 6
2 1 19
2 4 8
2 3 91
5 6 8
7 5 4
7 8 31
10 7 9
3
2 10 6
4 5 7 8 3
3 9 4 6

Sample Output

12
32
22

HINT

对于100%的数据,2<=n<=250000,m>=1,sigma(ki)<=500000,1<=ki<=n-1

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/8481231.html

bzoj千题计划254:bzoj2286: [Sdoi2011]消耗战相关推荐

  1. BZOJ 2150. 部落战争(最小路径覆盖问题)【BZOJ千题计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 刷题就图一乐 题目链接 https://hydro.ac/d/bzoj/p/2150 是 hydro ...

  2. BZOJ 2151 种树(可反悔贪心,链表)【BZOJ千题计划】就图一乐

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2151 是 hydro 的 BZOJ ...

  3. BZOJ 1799 [Ahoi2009] self 同类分布(数位DP)【BZOJ千题计划(quexin】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/1799(样例时限设置有问题,应该为 2 ...

  4. bzoj千题计划143:bzoj1935: [Shoi2007]Tree 园丁的烦恼

    http://www.lydsy.com/JudgeOnline/problem.php?id=1935 二维偏序问题 排序x,离散化树状数组维护y #include<cstdio> #i ...

  5. bzoj千题计划207:bzoj1879: [Sdoi2009]Bill的挑战

    http://www.lydsy.com/JudgeOnline/problem.php?id=1879 f[i][j] 表示匹配了i个字符,匹配字符串的状态为j的方案数 枚举下一个字符是什么 计算加 ...

  6. bzoj千题计划203:bzoj3994: [SDOI2015]约数个数和

    http://www.lydsy.com/JudgeOnline/problem.php?id=3994 设d(x)为x的约数个数,给定N.M,求 用到的一个结论: 证明: 枚举n的约数i,枚举m的约 ...

  7. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  8. bzoj千题计划201:bzoj1820: [JSOI2010]Express Service 快递服务

    http://www.lydsy.com/JudgeOnline/problem.php?id=1820 很容易想到dp[i][a][b][c] 到第i个收件地点,三个司机分别在a,b,c 收件地点的 ...

  9. bzoj千题计划303:bzoj4827: [Hnoi2017]礼物

    https://www.lydsy.com/JudgeOnline/problem.php?id=4827 式子化简一下,发现最后只跟 Σ xi*yi 有关 第二个序列反转,就可以用FFT优化 注意: ...

  10. bzoj千题计划248:bzoj3697: 采药人的路径

    http://www.lydsy.com/JudgeOnline/problem.php?id=3697 点分治 路径0改为路径-1 g[i][0/1] 和 f[i][0/1]分别表示当前子树 和 已 ...

最新文章

  1. 使用Windows远程登录Ubuntu
  2. C#开发ActiveX控件及制作CAB包
  3. mysql-mmm_MySQL-MMM高可用群集
  4. linux电脑内存查看工具,Linux内存查看工具---Smem
  5. python if语句判断字符串_python – 条件If语句:如果行中的值包含字符串…设置另一列等于字符串...
  6. 1370. 上升下降字符串
  7. javaScript函数封装
  8. efi文件错误服务器崩溃,[转自百度]关于系统安装时候弹出提示winload.efi文件损坏...
  9. journalctl
  10. matlab中二阶偏导数,matlab中二元函数的一阶和二阶偏导数
  11. 全民一起VBA提高篇 专题1 第二回 变体终非万全策,数字要分长短型
  12. python adf检验_ADF检验结果怎么看?
  13. 简易网页版进程管理器(支持手机管理电脑进程)
  14. 3 前端面试,js(上)
  15. CAD三维图自动生成三视图
  16. 什么叫横向比较和纵向比较
  17. 有哪些好用的微信群管理工具?
  18. 直播平台搭建iOS 版本打包上架
  19. 二叉树的层序遍历-Java
  20. 辣评10月自主SUV销量:优胜劣汰开始 哪些产品将死得其所?

热门文章

  1. docker host模式拿到nginx远程ip端口_docker网络模式实战
  2. 液晶指定位置显示 c语言,大家看看该怎么改才能让12864液晶显示屏显示21个字符啊?...
  3. ie手机浏览器_最终还是说再见!微软宣布重要消息,IE浏览器被放弃
  4. 20个你可能不知道的 Linux 网络工具
  5. 汽车后市场的大数据引擎谁人可造
  6. 一起来当网管(一)——Windows Server上的DHCP配置
  7. Cisco ASA防火墙基础--转载http://wenzhongxiang.blog.51cto.com/6370734/1249746
  8. 小A是支枪,子弹未打光---之手 枪篇
  9. Java comparator接口源码解读
  10. Python高性能编程