【Luogu】P2495消耗战(虚树DP)
我虚树没很理解啊qwq
就是我们有比较少的询问点,然后我们把不需要考虑的点搞一搞扔掉,然后每次询问给那些询问点单独建一颗树,然后乱搞。
……好吧看来是完全没理解……
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cctype>
#define maxn 500000
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} struct Edge{
int next,to,val;
}edge[maxn*];
int head[maxn],num;
inline void add(int from,int to,int val){
edge[++num]=(Edge){head[from],to,val};
head[from]=num;
} int stack[maxn],top;
int deep[maxn];
int s[maxn][];
int dfn[maxn],ID;
int q[maxn];
long long f[maxn];
long long ans[maxn];
bool flag[maxn]; void dfs(int x,int fa){
deep[x]=deep[fa]+; dfn[x]=++ID;
for(int i=head[x];i;i=edge[i].next){
int to=edge[i].to;
if(to==fa) continue;
s[to][]=x;
f[to]=min(f[x],(long long)edge[i].val);
dfs(to,x);
}
return;
} bool cmp(int a,int b){ return dfn[a]<dfn[b]; } int calclca(int a,int b){
if(deep[a]<deep[b]) swap(a,b);
int f=deep[a]-deep[b];
for(int i=;<<i<=f;++i)
if(f&(<<i)) a=s[a][i];
if(a==b) return a;
for(int i=;i>=;--i){
if(s[a][i]==s[b][i]) continue;
a=s[a][i];b=s[b][i];
}
return s[a][];
} void calc(int x,int fa){
long long sum=;
ans[x]=f[x];
for(int i=head[x];i;i=edge[i].next){
int to=edge[i].to;
if(to==fa) continue;
calc(to,x);
sum+=ans[to];
}
if(sum&&!flag[x]) ans[x]=min(ans[x],sum);
head[x]=;
return;
} int main(){
f[]=1e9; f[]=f[]*f[];
int n=read();
for(int i=;i<n;++i){
int from=read(),to=read(),val=read();
add(from,to,val);
add(to,from,val);
}
dfs(,);
for(int i=;i<=;++i)
for(int j=;j<=n;++j)
s[j][i]=s[s[j][i-]][i-];
int m=read();
memset(head,,sizeof(head));
for(int i=;i<=m;++i){
num=;top=;
int x=read();
for(int j=;j<=x;++j){ q[j]=read();flag[q[j]]=; }
sort(q+,q+x+,cmp);
for(int j=;j<=x;++j){
if(top==){
stack[++top]=q[j];
continue;
}
int lca=calclca(q[j],stack[top]);
while(dfn[lca]<dfn[stack[top]]){
if(dfn[lca]>=dfn[stack[top-]]){
add(lca,stack[top],);
if(stack[--top]!=lca) stack[++top]=lca;
break;
}
add(stack[top-],stack[top],);
top--;
}
stack[++top]=q[j];
}
while(top>){
add(stack[top-],stack[top],);
top--;
}
calc(stack[],stack[]);
printf("%lld\n",ans[stack[]]);
for(int j=;j<=x;++j) flag[q[j]]=;
}
return ;
}
【Luogu】P2495消耗战(虚树DP)的更多相关文章
- [BZOJ2286][SDOI2011]消耗战(虚树DP)
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4998 Solved: 1867[Submit][Statu ...
- bzoj 2286 [Sdoi2011]消耗战 虚树+dp
题目大意:多次给出关键点,求切断边使所有关键点与1断开的最小费用 分析:每次造出虚树,dp[i]表示将i和i子树与父亲断开费用 对于父亲x,儿子y ①y为关键点:\(dp[x]\)+=\(dismn( ...
- 【BZOJ】2286: [Sdoi2011]消耗战 虚树+DP
[题意]给定n个点的带边权树,每次询问给定ki个特殊点,求隔离点1和特殊点的最小代价.n<=250000,Σki<=500000. [算法]虚树+DP [题解]考虑普通树上的dp,设f[x ...
- [SDOI2011][bzoj2286] 消耗战 [虚树+dp]
题面: 传送门 思路: 看到所有询问中的点数总和是十万级别的,就想到用虚树~\(≧▽≦)/~啦 首先,树形dp应该是很明显可以看出来的: 设dp[u]表示以u为根的子树(不包括u)中的宝藏岛全部切断的 ...
- 洛谷P2495 [SDOI2011]消耗战(虚树dp)
P2495 [SDOI2011]消耗战 题目链接 题解: 虚树\(dp\)入门题吧.虚树的核心思想其实就是每次只保留关键点,因为关键点的dfs序的相对大小顺序和原来的树中结点dfs序的相对大小顺序都是 ...
- bzoj 3572世界树 虚树+dp
题目大意: 给一棵树,每次给出一些关键点,对于树上每个点,被离它最近的关键点(距离相同被标号最小的)控制 求每个关键点控制多少个点 分析: 虚树+dp dp过程如下: 第一次dp,递归求出每个点子树中 ...
- [SDOI2011]消耗战(虚树+树形动规)
虚树dp 虚树的主要思想: 不遍历没用的的节点以及没用的子树,从而使复杂度降低到\(\sum\limits k\)(k为询问的节点的总数). 所以怎么办: 只把询问节点和其LCA放入询问的数组中. 1 ...
- [BZOJ5287][HNOI2018]毒瘤(虚树DP)
暴力枚举非树边取值做DP可得75. 注意到每次枚举出一个容斥状态的时候,都要做大量重复操作. 建立虚树,预处理出虚树上两点间的转移系数.也可动态DP解决. 树上倍增.动态DP.虚树DP似乎是这种问题的 ...
- BZOJ 3572 [HNOI2014]世界树 (虚树+DP)
题面:BZOJ传送门 洛谷传送门 题目大意:略 细节贼多的虚树$DP$ 先考虑只有一次询问的情况 一个节点$x$可能被它子树内的一个到x距离最小的特殊点管辖,还可能被管辖fa[x]的特殊点管辖 跑两次 ...
随机推荐
- Python学习——1113
在命令界面直接输入python,进入交互模式,相当于启动了Python解释器,需要一行一行的输入,输入一行,执行一行. 在命令界面直接运行.py文件,相当于直接启动了Python解释器,一次性把.py ...
- python+opencv模拟生成运动模糊核
Mark:https://www.cnblogs.com/wyh1993/p/7118559.html 效果非常的好
- 关于tomcat的classloader的一点想法
关于tomcat的classloader相关的帖子网上非常多,我觉得比较好的有: https://www.jianshu.com/p/d90e4430b0b9 https://blog.csdn.ne ...
- SC || 那些CheckStyle中的错误们
lab5里给了我们一个checkstyle查代码风格的方法.. 然后 lab4代码 copy一份! 添加checkstyle! 项目 右键 checkstyle!(自信脸) 3s后——7256 war ...
- PayPal为什么从Java迁移到Node.js 性能提高一倍 文件代码减少44%
大家都知道PayPal是另一家迁移到Node.js平台的大型公司,Jeff Harrell的这篇博文 Node.js at PayPal 解释了为什么从Java迁移出来的原因: 开发效率提高一倍(2 ...
- ReactiveCocoa概念解释篇
1.ReactiveCocoa简介 ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架,Cocoa是苹果整套框架的简称,因此很多苹果框架喜欢以Coco ...
- C++:100阶乘数组输出
#include <iostream> using namespace std; int main(){ int i =1; int a[2048]={0}; while(i !=101) ...
- python入门:最基本的用户登录用户登录,三次错误机会
#!/usr/bin/env python # -*- coding:utf-8 -*- #用户登录,三次错误机会 """ 导入getpass,给x赋值为1,while真 ...
- python入门:输出1-10以内除去7的所有数(经典)
#!/usr/bin/env python # -*-coding:utf-8 -*- #输出1-10以内除去7的所有数(经典) """ 给kaishi赋值为1,whil ...
- German Collegiate Programming Contest 2015 计蒜课
// Change of Scenery 1 #include <iostream> #include <cstdio> #include <algorithm> ...