#include<cstdio>
#include<iostream>
#define M 1000009
#define N 250009
#define ll long long
#define inf 1000000000000000000LL
#include<algorithm>
using namespace std;
int n,head[N],next[M],u[M],cnt,fa[N][],deep[N],m,h[N],dfn[N],TI,cnt1,zhan[N],tot,head1[N];
int next1[M],u1[M],v[M];
ll mn[N],f[N];
void jia(int a1,int a2,int a3)
{
cnt++;
next[cnt]=head[a1];
head[a1]=cnt;
u[cnt]=a2;
v[cnt]=a3;
return;
}
void jia2(int a1,int a2)
{
if(a1==a2)
return;
cnt1++;
next1[cnt1]=head1[a1];
head1[a1]=cnt1;
u1[cnt1]=a2;
return;
}
void dfs(int a1)
{
dfn[a1]=++TI;
for(int i=;(<<i)<=deep[a1];i++)
fa[a1][i]=fa[fa[a1][i-]][i-];
for(int i=head[a1];i;i=next[i])
if(u[i]!=fa[a1][])
{
deep[u[i]]=deep[a1]+;
fa[u[i]][]=a1;
mn[u[i]]=min(mn[a1],(ll)v[i]);
dfs(u[i]);
}
}
bool cmp(int a1,int a2)
{
return dfn[a1]<dfn[a2];
}
int lca(int a1,int a2)
{
if(deep[a1]<deep[a2])
swap(a1,a2);
int a3=deep[a1]-deep[a2];
for(int i=;i<=;i++)
if(a3&(<<i))
a1=fa[a1][i];
for(int i=;i>=;i--)
if(fa[a1][i]!=fa[a2][i])
{
a1=fa[a1][i];
a2=fa[a2][i];
}
if(a1==a2)
return a1;
return fa[a1][];
}
void dp(int a1)
{
ll tmp=;
f[a1]=mn[a1];
for(int i=head1[a1];i;i=next1[i])
{
dp(u1[i]);
tmp+=f[u1[i]];
}
head1[a1]=;
if(tmp<f[a1]&&tmp)
f[a1]=tmp;
return;
}
void solve()
{
cnt1=;
scanf("%d",&h[]);
for(int i=;i<=h[];i++)
scanf("%d",&h[i]);
sort(h+,h+h[]+,cmp);
int tot=;
h[++tot]=h[];
for(int i=;i<=h[];i++)
if(lca(h[tot],h[i])!=h[tot])h[++tot]=h[i];
h[]=tot;
tot=;
zhan[++tot]=;
for(int i=;i<=h[];i++)
{
int f=lca(h[i],zhan[tot]);
for(;;)
{
if(deep[f]>=deep[zhan[tot-]])
{
jia2(f,zhan[tot]);
tot-=;
if(zhan[tot]!=f)
{
tot+=;
zhan[tot]=f;
}
break;
}
jia2(zhan[tot-],zhan[tot]);
tot-=;
}
if(h[i]!=zhan[tot])
{
tot+=;
zhan[tot]=h[i];
}
}
for(;tot>;jia2(zhan[tot-],zhan[tot]),tot--);
dp();
printf("%lld\n",f[]);
return;
}
int main()
{
scanf("%d",&n);
for(int i=;i<n;i++)
{
int a1,a2,a3;
scanf("%d%d%d",&a1,&a2,&a3);
jia(a1,a2,a3);
jia(a2,a1,a3);
}
mn[]=inf;
dfs();
scanf("%d",&m);
for(int i=;i<=m;i++)
solve();
return ;
}

显然想到DP,然而DP超时,这个题是构建虚树,然后DP。

bzoj 2286: [Sdoi2011消耗战的更多相关文章

  1. BZOJ 2286: [Sdoi2011]消耗战

    2286: [Sdoi2011消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2082  Solved: 736[Submit][Status] ...

  2. bzoj 2286: [Sdoi2011]消耗战 虚树+树dp

    2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 在一 ...

  3. bzoj 2286 [Sdoi2011]消耗战(虚树+树上DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2286 [题意] 给定一棵树,切断一条树边代价为ci,有m个询问,每次问使得1号点与查询 ...

  4. bzoj 3611: [Heoi2014]大工程 && bzoj 2286: [Sdoi2011消耗战

    放波建虚树的模板. 大概是用一个栈维护根节点到当前关键点的一条链,把其他深度大于lca的都弹出去. 每次做完记得复原. 还有sort的时候一定要加cmp!!! bzoj 3611 #include&l ...

  5. BZOJ 2286: [Sdoi2011]消耗战 虚树 树形dp 动态规划 dfs序

    https://www.lydsy.com/JudgeOnline/problem.php?id=2286 wa了两次因为lca犯了zz错误 这道题如果不多次询问的话就是裸dp. 一棵树上多次询问,且 ...

  6. BZOJ.2286.[SDOI2011]消耗战(虚树 树形DP)

    题目链接 BZOJ 洛谷P2495 树形DP,对于每棵子树要么逐个删除其中要删除的边,要么直接断连向父节点的边. 如果当前点需要删除,那么直接断不需要再管子树. 复杂度O(m*n). 对于两个要删除的 ...

  7. BZOJ 2286 [Sdoi2011]消耗战(虚树+树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2286 [题目大意] 出一棵边权树,每次给出一些关键点,求最小边割集, 使得1点与各个关 ...

  8. bzoj 2286 [Sdoi2011]消耗战 虚树+dp

    题目大意:多次给出关键点,求切断边使所有关键点与1断开的最小费用 分析:每次造出虚树,dp[i]表示将i和i子树与父亲断开费用 对于父亲x,儿子y ①y为关键点:\(dp[x]\)+=\(dismn( ...

  9. BZOJ 2286: [Sdoi2011消耗战 [DP 虚树]

    传送门 题意: 删除价值和最小的边使得$1$号点与$k$个关键点不连通 一个树形DP...但是询问多次,保证总的关键点数为$O(n)$ 先说一下这个$DP$ $f[i]$表示子树$i$中的关键点与$1 ...

随机推荐

  1. 06 SQL执行计划

    解释计划 与 执行计划的 区别 随着可以得到解释计划输出的开发工具, 比如 toad 的普遍使用, 生成解释计划就变的相当简单. 而不简单的是得到执行计划. 解释计划 EXPLAIN PLAN 用来显 ...

  2. 【服务器环境搭建-Centos】系统分区 待续

    df命令查看,显示/dev/vda,而不是sda或hda ,为什么? 虚拟机为了提升性能,一般使用virtio作为磁盘驱动,在虚拟机里面磁盘会显示成vda而不是传统的sda,有什么办法可以让他显示成s ...

  3. JAVA 程序设置运行内存

    1.修改jdk设置 2.如果不行则 一般安装完eclipse之后,在安装目录下你应该可以看到有一个 eclipse.ini 文件,对了,就是在这个文件里面修改 -vmargs:说明后面是VM的参数 - ...

  4. 测序深度和覆盖度(Sequencing depth and coverage)

    总是跑数据,却对数据一无所知,这说不过去吧. 看几篇文章吧 Sequencing depth and coverage: key considerations in genomic analyses( ...

  5. 测试耗电量的工具(Android)

    Emmagee是监控指定被测应用在使用过程中占用机器的CPU.内存.流量资源的性能测试小工具. 支持SDK:Android2.2以及以上版本 Emmagee功能介绍 1.检测当前时间被测应用占用的CP ...

  6. 十问 Linux 虚拟内存管理 (glibc) (二)

    版权声明:本文由陈福荣原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/184 来源:腾云阁 https://www.qclo ...

  7. eclipse 新建 maven 项目 步骤(初级入门新手)

    安装 maven(百度) 和在eclipse 中svn(上一篇) 修改 maven 本地仓库 eclipse 属性 maven--> installations-->添加新的 自定义安装的 ...

  8. 【转】 C++中delete和delete[]的区别

    一直对C++中的delete和delete[]的区别不甚了解,今天遇到了,上网查了一下,得出了结论.做个备份,以免丢失. C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete ...

  9. Mustache.js使用笔记(内容属于转载总结)

    1.Mustache的语法很简单,用两个大括号标记要绑定的字段即可,“{{}}” Mustache主要的渲染方法为Mustache.render(),该方法有两个参数,第一个为要渲染的模版, 也就是例 ...

  10. [JavaScript] 函数同名问题

    存在同名函数时,最后的函数会覆盖掉以前的同名函数. var x = 1, y = z = 0; function add(n) { return n = n + 1; } y = add(x); fu ...