bzoj 2286: [Sdoi2011消耗战
#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消耗战的更多相关文章
- BZOJ 2286: [Sdoi2011]消耗战
2286: [Sdoi2011消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2082 Solved: 736[Submit][Status] ...
- bzoj 2286: [Sdoi2011]消耗战 虚树+树dp
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 在一 ...
- bzoj 2286 [Sdoi2011]消耗战(虚树+树上DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2286 [题意] 给定一棵树,切断一条树边代价为ci,有m个询问,每次问使得1号点与查询 ...
- bzoj 3611: [Heoi2014]大工程 && bzoj 2286: [Sdoi2011消耗战
放波建虚树的模板. 大概是用一个栈维护根节点到当前关键点的一条链,把其他深度大于lca的都弹出去. 每次做完记得复原. 还有sort的时候一定要加cmp!!! bzoj 3611 #include&l ...
- BZOJ 2286: [Sdoi2011]消耗战 虚树 树形dp 动态规划 dfs序
https://www.lydsy.com/JudgeOnline/problem.php?id=2286 wa了两次因为lca犯了zz错误 这道题如果不多次询问的话就是裸dp. 一棵树上多次询问,且 ...
- BZOJ.2286.[SDOI2011]消耗战(虚树 树形DP)
题目链接 BZOJ 洛谷P2495 树形DP,对于每棵子树要么逐个删除其中要删除的边,要么直接断连向父节点的边. 如果当前点需要删除,那么直接断不需要再管子树. 复杂度O(m*n). 对于两个要删除的 ...
- BZOJ 2286 [Sdoi2011]消耗战(虚树+树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2286 [题目大意] 出一棵边权树,每次给出一些关键点,求最小边割集, 使得1点与各个关 ...
- bzoj 2286 [Sdoi2011]消耗战 虚树+dp
题目大意:多次给出关键点,求切断边使所有关键点与1断开的最小费用 分析:每次造出虚树,dp[i]表示将i和i子树与父亲断开费用 对于父亲x,儿子y ①y为关键点:\(dp[x]\)+=\(dismn( ...
- BZOJ 2286: [Sdoi2011消耗战 [DP 虚树]
传送门 题意: 删除价值和最小的边使得$1$号点与$k$个关键点不连通 一个树形DP...但是询问多次,保证总的关键点数为$O(n)$ 先说一下这个$DP$ $f[i]$表示子树$i$中的关键点与$1 ...
随机推荐
- 对象导论 Thinking in Java 第一章
1.1 抽象过程 1.人们能够解决问题的复杂性直接取决于抽象的类型和质量. 1.2 每个对象都有一个接口 1.3 每个对象都提供服务 1.4 被隐藏的具体实现 1.程序猿分为:类创建者 和 客户端程序 ...
- 树的计数 + prufer序列与Cayley公式 学习笔记
首先是 Martrix67 的博文:http://www.matrix67.com/blog/archives/682 然后是morejarphone同学的博文:http://blog.csdn.ne ...
- Oracle 10g实现存储过程异步调用
DBMS_JOB是什么?DBMS_JOB是Oracle数据库提供的专家程序包的一个.主要用来在后台运行程序,是数据库中一个极好的工具. 可用于自动调整调度例程任务,例如分析数据表,执行一些归档操作,清 ...
- Java字符串处理函数
substring() 它有两种形式,第一种是:String substring(int startIndex)第二种是:String substring(int startIndex,int end ...
- 转!!JavaBean,List,Map转成json格式
public class User { private String username; private String password; public String getUsername() { ...
- sql中charindex
假如你写过很多程序,你可能偶尔会碰到要确定字符或字符窜串否包含在一段文字中,在这篇文章中,我将讨论使用CHARINDEX和PATINDEX函数来搜索文字列和字符串.我将告诉你这两个函数是如何运转的,解 ...
- LinuxShell脚本攻略--第二章 命令之乐
用 cat 进行拼接 文件查找与文件列表玩转 xargs 用 tr 进行转换排序临时文件命名与随机数分割文件和数据根据扩展名切分文件名mv 批量重命名文件交互输入自动化 cat: echo 'Text ...
- ListView 搭配SimpleAdapter
这是SimplerAdapter的构造函数 public SimpleAdapter(Context context, List<? extends Map<String, ?>&g ...
- CLGeocoder Error Domain=kCLErrorDomain Code=2
使用CLGeocoder解码地址时,遇到错误 Error Domain=kCLErrorDomain Code=2 代码: #pragma mark 跟踪定位代理方法,每次位置发生变化即会执行(只要定 ...
- Docker 使用指南 (六)—— 使用 Docker 部署 Django 容器栈
版权声明:本文由田飞雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/98 来源:腾云阁 https://www.qclou ...