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. 求解稀疏优化问题——增广拉格朗日方法+半光滑牛顿法
  2. 解题报告(二)C、(darkBZOJ 2194) 快速傅立叶之二(FFT、卷积的概念、常用变换)
  3. 最新!全球学术排名出炉:18所中国大学位居世界100强
  4. 线索二叉树代码实现 - 数据结构和算法49
  5. python3安装常见问题_python3中pip的安装、常见问题及万能解决方案。
  6. 静态主席树总结(静态区间的k大)
  7. 闲来无事刷水题、简单博弈论专题、sg函数、洛谷
  8. 2018年华北五省计算机应用大赛参赛作品--战拖儿app
  9. html5游戏毕业答辩ppt,毕业论文答辩ppt格式(超详细解释)
  10. C# OpenXml组件
  11. 百分之99的人都不知道的Python爆破ZIP文件
  12. 昭阳K43/E43系列网卡功能相关说明
  13. 用 construct 2 制作简易弹幕游戏
  14. PUT和POST的区别
  15. 神器 | 教你去除视频马赛克
  16. Abp Core 添加短信验证码登录(动态密码登录)
  17. 工欲善其事必先利其器,利用搜狗输入法设置代码片段
  18. C语言中-含义,比如说 p=p-next
  19. 苹果xr十大隐藏功能_苹果手机有哪些隐藏小功能?【建议收藏】
  20. 小数除法用计算机探索规律教学反思,小数除法教学反思

热门文章

  1. win7 mac虚拟机linux,Mac虚拟机parallels desktop超详细安装Win7图文分解
  2. 基于HMM和维特比算法的中文分词
  3. Python并发编程之多进程(实战)
  4. jenkins 2.121.1 部署项目
  5. 51nod 1526 分配笔名(字典树+贪心)
  6. 1.3 将临时变量内联化
  7. kafka单机环境搭建
  8. JFinal开发8个常见问题
  9. 你知道url中的特殊符号含义么
  10. 救急的戴尔Latitude 10商用平板电脑