BZOJ2286: [Sdoi2011]消耗战
建出虚树dp。
把询问点按dfs序排序,用一个以dfs序为关键字的单调栈(以深度为关键字也是一样的),每次将一个询问点与栈顶的点的lca入栈,再将这个询问点入栈,在这个过程中建出一棵树就是虚树。具体看代码。
#include<bits/stdc++.h>
#define N 250005
using namespace std;
typedef long long LL;
int n,m,q;
struct edge{
edge* s;
int v,w;
}e[N<<1],*back=e,*h[N];
void add(
int u,int v,int w){
h[u]=&(*back++
=(edge){h[u],v,w});
h[v]=&(*back++
=(edge){h[v],u,w});
}
void add(int u,int v){
h[u]=&(*back++
=(edge){h[u],v});
}
typedef int ds[N];
ds d,num,p,size,son,top,t,z,v,a;
void dfs1(int u){
d[u]=d[p[u]]+1;
size[u]=1;
int s=0;
for(edge* i=h[u];i;i=i->s)
if(i->v!=p[u]){
p[i->v]=u;
t[i->v]=min(t[u],i->w);
dfs1(i->v);
size[u]+=size[i->v];
if(s<size[i->v])
s=size[son[u]=i->v];
}
}
void dfs2(int u){
static int cnt;
num[u]=++cnt;
if(size[u]!=1){
top[son[u]]=top[u];
dfs2(son[u]);
}
for(edge*& i=h[u];i;i=i->s)
if(i->v!=p[u]
&&i->v!=son[u])
dfs2(top[i->v]=i->v);
}
int lca(int s,int t){
while(top[s]!=top[t]){
if(d[top[s]]<d[top[t]])
swap(s,t);
s=p[top[s]];
}
return d[s]<d[t]?s:t;
}
bool foo(int i,int j){
return num[i]<num[j];
}
LL dp(int u){
LL s=0;
for(edge*& i=h[u];i;i=i->s)
s+=dp(i->v);
return u==1||s<t[u]
&&z[u]!=q+1?s:t[u];
}
void writeln(int u){
printf("%d\n",u);
}
void writeln(LL u){
printf("%lld\n",u);
}
int main(){
scanf("%d",&n);
for(int i=1;i!=n;++i){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
t[1]=1e9;
dfs1(1);
dfs2(top[1]=1);
scanf("%d",&q);
while(q--){
scanf("%d",&m);
for(int j=0;j!=m;++j)
scanf("%d",a+j);
sort(a,a+m,foo);
back=e;
int i=v[1]=1,j=0;
while(j!=m){
int u=lca(v[i],a[j]);
while(d[u]<d[v[i]]){
--i;
if(d[u]<d[v[i]])
add(v[i],v[i+1]);
else{
add(u,v[i+1]);
v[i+=v[i]!=u]=u;
}
}
z[a[j]]=q+1;
v[++i]=a[j++];
}
while(--i)
add(v[i],v[i+1]);
writeln(dp(1));
}
}
BZOJ2286: [Sdoi2011]消耗战的更多相关文章
- [BZOJ2286][SDOI2011]消耗战(虚树DP)
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4998 Solved: 1867[Submit][Statu ...
- [BZOJ2286][Sdoi2011]消耗战(虚树上DP)
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6457 Solved: 2533[Submit][Statu ...
- bzoj千题计划254:bzoj2286: [Sdoi2011]消耗战
http://www.lydsy.com/JudgeOnline/problem.php?id=2286 虚树上树形DP #include<cmath> #include<cstdi ...
- BZOJ2286 [Sdoi2011]消耗战 【虚树 + 树形Dp】
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 4261 Solved: 1552 [Submit][Sta ...
- BZOJ2286 [Sdoi2011]消耗战 和 BZOJ3611 [Heoi2014]大工程
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6371 Solved: 2496[Submit][Statu ...
- [Bzoj2286][Sdoi2011]消耗战(虚树模板题附讲解)
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4896 Solved: 1824[Submit][Statu ...
- 【学习笔记】虚树复习记(BZOJ2286 SDOI2011 消耗战)
想写战略游戏却想不起来虚树T^T 所以就有了这篇复习记QwQ ——简介!—— 我们在处理树上问题的时候,dfs是一个常用手段,但是我们发现,如果一棵树上只有一部分关键点,每次dfs需要访问好多不是关键 ...
- [bzoj2286][Sdoi2011]消耗战(虚树上的DP)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2286 分析:对于普通的树形dp:f[x]=min(∑f[son],m[x]),其中f[ ...
- [bzoj2286] [Sdoi2011消耗战
还是虚树恩..模板都能打挂QAQ 先在原树上预处理出mndis[i],表示根节点到节点i 路径上边权的最小值(就是断开i与根的联系的最小花费) 建完虚树在虚树上跑树形DP..f[i]表示断开 i 所 ...
随机推荐
- jQuery——$(function(){});与$(document).ready(function(){});的区别
只要在我们的jsp页面中写上 <script> $(function(){ //内容 }); </script> 则,函数中的内容就会在jsp页面被载入的时候就被执行,实际上, ...
- error_reporting()
定义和用法 error_reporting() 设置 PHP 的报错级别并返回当前级别. 语法 error_reporting(report_level) 如果参数 level 未指定,当前报错级别将 ...
- cmd 下telnet 不是内部或外部命令
问题:cmd 下telnet 提示不是内部或外部命令 解决方案:
- 对C语言中指针的一些新认识
学C语言这么久了,才发现指针不是想象中那么简单,当初根本就没理解指针怎么用! 变量--是由操作系统自动分配存储空间的 指针--手动分配存储空间或指向已有变量的地址 指针中的内容需要手动释放,而变 ...
- Qt做动画旋转旋转图片
今天看到百度首页的音乐播放有个图片可以旋转,感觉很酷就用qt做了一个类似的,关键时刻还是要发挥数学功底,静下心来,写一写,画一画,编程对数学分析能力要求还是不小的,以后要经常锻炼数学分析能力啊! Wi ...
- JAVA file文件操作
/** *文件重命名 * @param oldname 原来的文件名 * @param newname 新文件名 */ @RequestMapping("renameFile") ...
- 【转】JSP使用上传文件,并生产高清缩略图示例
原文地址:http://blog.csdn.net/yakson/article/details/9875731 前言 刚开始本来只想来测试一下Thumbnails生成缩略图的效果的,顺便来学一下js ...
- FastFDFS_Jave客户端调用(亲测可用)
一.配置文件(fdfs_client.properties) 1 2 3 4 5 6 7 8 9 10 connect_timeout = 30 network_timeout = 60 charse ...
- 【URAL 1486】Equal Squares
题意:求给定字符矩阵中相同正方形矩阵的最大边长和这两个相同正方形的位置 第一次写字符串哈希,选两个不同的模数进行二维字符串哈希. 本来应该取模判断相等后再暴力扫矩阵来判断,但是我看到<Hash在 ...
- 二、处理MVC多级目录问题——以ABP为基础架构的一个中等规模的OA开发日志
就个人感觉而言.ASP.NET MVC是一种非常反人类的设计.(我没有接触过Java的MVC,不知道两者是否一样.如果一样,那么搞Java的同学也挺可怜.)尤其是MVC的路由机制,灰常灰常反动.路由所 ...