建出虚树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]消耗战的更多相关文章

  1. [BZOJ2286][SDOI2011]消耗战(虚树DP)

    2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4998  Solved: 1867[Submit][Statu ...

  2. [BZOJ2286][Sdoi2011]消耗战(虚树上DP)

    2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6457  Solved: 2533[Submit][Statu ...

  3. bzoj千题计划254:bzoj2286: [Sdoi2011]消耗战

    http://www.lydsy.com/JudgeOnline/problem.php?id=2286 虚树上树形DP #include<cmath> #include<cstdi ...

  4. BZOJ2286 [Sdoi2011]消耗战 【虚树 + 树形Dp】

    2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 4261  Solved: 1552 [Submit][Sta ...

  5. BZOJ2286 [Sdoi2011]消耗战 和 BZOJ3611 [Heoi2014]大工程

    2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6371  Solved: 2496[Submit][Statu ...

  6. [Bzoj2286][Sdoi2011]消耗战(虚树模板题附讲解)

    2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4896  Solved: 1824[Submit][Statu ...

  7. 【学习笔记】虚树复习记(BZOJ2286 SDOI2011 消耗战)

    想写战略游戏却想不起来虚树T^T 所以就有了这篇复习记QwQ ——简介!—— 我们在处理树上问题的时候,dfs是一个常用手段,但是我们发现,如果一棵树上只有一部分关键点,每次dfs需要访问好多不是关键 ...

  8. [bzoj2286][Sdoi2011]消耗战(虚树上的DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2286 分析:对于普通的树形dp:f[x]=min(∑f[son],m[x]),其中f[ ...

  9. [bzoj2286] [Sdoi2011消耗战

    还是虚树恩..模板都能打挂QAQ 先在原树上预处理出mndis[i],表示根节点到节点i 路径上边权的最小值(就是断开i与根的联系的最小花费) 建完虚树在虚树上跑树形DP..f[i]表示断开  i 所 ...

随机推荐

  1. mac搭建mamp环境

    1 先安装homebrew; 执行:cd /usr/local; 非root用户执行: ruby -e "$(curl -fsSL https://raw.githubusercontent ...

  2. tornado和django的结合使用 tornado Server for django WSGI APP

    #!/usr/bin/env python # Run this with # Serves by default at # http://localhost:8080/hello-tornado a ...

  3. iOS -- 上传多张图片 后台(PHP)代码和上传一张的一样

    // 上传多张图片 - (void)send { // 设置初始记录量为0 self.count = 0; self.upcount = 0; // 设置初始值为NO self.isUploadPic ...

  4. UITextView的使用详解

    //初始化并定义大小 UITextView *textview = [[UITextView alloc] initWithFrame:CGRectMake(20, 10, 280, 30)]; te ...

  5. 71 fdisk-Linux 的磁盘分区表操作工具。

    语法: fdisk [-l] 装置名称 选项与参数: -l :输出后面接的装置所有的分区内容.若仅有 fdisk -l 时, 则系统将会把整个系统内能够搜寻到的装置的分区均列出来. 实例 列出所有分区 ...

  6. nginx中获取真实ip

    nginx反向代理配置时,一般会添加下面的配置: proxy_set_header Host $host;      proxy_set_header X-Real-IP $remote_addr;  ...

  7. Android 强制竖屏

    一般android 显示内容都有两种实现方式,java代码中实现,xml布局中实现(或者权限管理页面) 直接上代码: java方法 setRequestedOrientation(ActivityIn ...

  8. 基于tiny4412原生uboot修改制作SD启动并烧写到emmc

    最近入手tiny4412的标准板,底板SDK型号为1506.但是因为友善之臂提供的superboot不能进入boot菜单,此时我就不能通过tftp下载内核和通过nfs挂载根文件系统,于是想自己做个ub ...

  9. zabbix监控网络的出入口流量

    首先我们登录到zabbix 点击配置---->模板-->Template OS Linux 下的监控项 点击右上角的添加监控项目 我们的服务器是在Ucloud上的,我们的网卡名称为eth0 ...

  10. 【转】如何建立一个样式新颖的CSS3搜索框

    在线演示 搜索框大概是web开发中最常用的UI元素之一,我想基本没有必要去介绍如何使用它.无论是网站还是web应用,都会为了增强用户体验而添加它,那么你是不是也想过设计一个别致的搜索框? 在今天的文章 ...