虚树入门题;

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<ctime>
#include<cmath>
#include<iostream>
using namespace std;
#define LL long long
#define pii pair<int,int>
#define up(i,j,n) for(int i=(j);i<=(n);i++)
#define FILE "dealing"
int read(){
int f=1,x=0,ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f*x;
}
const int maxn=505000,inf=1000000000;
int n,m,lim,k;
struct node{int y,next,v;}e[maxn],E[maxn];
LL linkk[maxn],len=0,linker[maxn],pre[maxn],vis[maxn],Len,d[maxn][31],fa[maxn][31],dfs_clock,dep[maxn],q[maxn],top=0,f[maxn];
pii a[maxn];
void insert(int x,int y,int v){e[++len].y=y;e[len].next=linkk[x];linkk[x]=len;e[len].v=v;}
void insert2(int x,int y,int v){E[++Len].y=y;E[Len].next=linker[x];linker[x]=Len;E[Len].v=v;}
void dfs(int x){
pre[x]=++dfs_clock;
for(int i=linker[x];i;i=E[i].next){
if(E[i].y==fa[x][0])continue;
fa[E[i].y][0]=x;
d[E[i].y][0]=E[i].v;
dep[E[i].y]=dep[x]+1;
dfs(E[i].y);
}
}
int lca(int x,int y){
if(dep[x]>dep[y])swap(x,y);
for(int i=lim;i>=0;i--)if(dep[y]-dep[x]>=(1<<i))y=fa[y][i];
if(x==y)return x;
for(int i=lim;i>=0;i--)if(fa[y][i]!=fa[x][i])x=fa[x][i],y=fa[y][i];
return fa[x][0];
}
LL fmin(LL x,LL y){
if(dep[x]>dep[y])swap(x,y);
LL Min=inf;
for(int i=lim;i>=0;i--)if(dep[y]-dep[x]>=(1<<i))Min=min((LL)Min,d[y][i]),y=fa[y][i];
return Min;
}
void dp(int x,int fa,int w){
if(vis[x]&&x!=1){f[x]=w;return;}
else {
f[x]=0;
for(int i=linkk[x];i;i=e[i].next){
if(e[i].y==fa)continue;
dp(e[i].y,x,e[i].v);
f[x]+=f[e[i].y];
}
if(x!=1)f[x]=min(f[x],(LL)w);
}
}
void clear(int x,int fa){
for(int i=linkk[x];i;i=e[i].next){
if(e[i].y==fa)continue;
clear(e[i].y,x);
}
f[x]=0;
linkk[x]=0;
}
int main(){
//freopen("dealing.in","r",stdin);
//freopen("dealing.out","w",stdout);
n=read();lim=(int)log2(n*1.0+1)+1;
up(i,1,n-1){
int x=read(),y=read(),v=read();
insert2(x,y,v);insert2(y,x,v);
}
dfs(1);
up(j,1,lim)up(i,1,n)fa[i][j]=fa[fa[i][j-1]][j-1],d[i][j]=min(d[i][j-1],d[fa[i][j-1]][j-1]);
m=read();
while(m--){
k=read()+1;a[k].second=1;
up(i,1,k-1)a[i].second=read();
up(i,1,k)a[i].first=pre[a[i].second],vis[a[i].second]=1;vis[1]=0;
sort(a+1,a+k+1);
up(i,1,k){
int x=a[i].second;
if(!top){q[++top]=x;continue;}
int Lca=lca(x,q[top]);
if(Lca==q[top]){q[++top]=x;continue;}
while(dep[q[top-1]]>dep[Lca]){
LL v=fmin(q[top],q[top-1]);
insert(q[top],q[top-1],v);insert(q[top-1],q[top],v);
top--;
}
LL v=fmin(Lca,q[top]);
insert(Lca,q[top],v);insert(q[top],Lca,v);
top--;
if(q[top]!=Lca)q[++top]=Lca;q[++top]=x;
}
while(top!=1){
LL v=fmin(q[top],q[top-1]);
insert(q[top],q[top-1],v);
insert(q[top-1],q[top],v);
top--;
}
dp(1,0,0);top=0;
printf("%lld\n",f[1]);
clear(1,0);
up(i,1,k)vis[a[i].second]=0;len=0;
}
return 0;
}

  

【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]消耗战

    建出虚树dp. 把询问点按dfs序排序,用一个以dfs序为关键字的单调栈(以深度为关键字也是一样的),每次将一个询问点与栈顶的点的lca入栈,再将这个询问点入栈,在这个过程中建出一棵树就是虚树.具体看 ...

  10. [bzoj2286] [Sdoi2011消耗战

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

随机推荐

  1. python笔记1:python基础

    1.Python模块的标准文件模板: #!/usr/bin/env python #第1行注释可以让这个 .py 文件直接在Unix/Linux/Mac上运行 # -*- coding: utf-8 ...

  2. LaTeX 如何在文档的侧面插入图片实现"绕排"?

    https://www.zhihu.com/question/26837705 https://blog.csdn.net/u012856866/article/details/70305834

  3. C++: 多态 虚函数

    一.多态: 1.多态是什么:具有不同功能的函数可以用同一个函数名 2.静态多态:程序编译时决定,通过函数重载实现. 3.动态多态:程序运行时决定,通过虚函数实现. 二.虚函数: 1.引入目的:可以通过 ...

  4. vim可视化&Linux系统安全最小化原则& su & sudo

    一.vim在可视化模式下编辑 crl+v,会变成-- VISUAL BLOCK --,然后用上下左右键去选中. 多行注释: ESC进入命令行模式; Ctrl+v进入VISUAL BLOCK模式 上下左 ...

  5. 初学ElasticSeacher

    这周,刚接手了同事那边的工作,项目里需要用到ElasticSeacher.但是,之前从未接触过,因此,看了ES的文档,开始慢慢的知道了一些ES的知识. 一.ES简介: Elasticsearch是一个 ...

  6. 提交IOS开发效率的几个插件(Xcode神器推荐贴)

    Code Pilot 2 Xcode上的Command-T,讓你快速跳轉到某個文件或某個符號 XVim 讓Xcode使用Vim的鍵綁定,Vim党必備 Injection for Xcode 調試利器, ...

  7. 【spring cloud】spring cloud子module的pom文件添加依赖,出现unknown问题【maven】

    spring cloud项目,一般都是父项目中有多个子服务,也就是子module模块. 如下图: 问题描述:在父项目中引用了常用的jar包,例如,引入了spring boot的依赖,那么在子项目中引入 ...

  8. 转:如何mac下使用wireshark

    Mac OS Mountain Lion默认是没有安装X11的,而wireshark运行需要x11,因此如果直接安装wireshark而没有安装x11,wireshark不会正常运行. 去苹果主页下载 ...

  9. [反汇编练习] 160个CrackMe之032

    [反汇编练习] 160个CrackMe之032. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  10. 【足迹C++primer】39、动态内存与智能指针(3)

    动态内存与智能指针(3) /** * 功能:动态内存与智能指针 * 时间:2014年7月8日15:33:58 * 作者:cutter_point */ #include<iostream> ...