虚树裸题。

23333以后memset千万慎用。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxv 250050
#define maxe 500050
#define inf 0x7f7f7f7f7f7f7f7fLL
using namespace std;
struct edge
{
long long v,w,nxt;
}e[maxe],tr[maxe<<];
struct ask
{
long long pnt,dfn;
}q[maxv];
using namespace std;
long long n,x,y,z,g[maxv],nume=,numt=,gt[maxv],dfn[maxv],dis[maxv],anc[maxv][],mn[maxv][],dep[maxv];
long long m,k,stack[maxv],top=,times=,val[maxv],hash[maxv],now_cnt,fath[maxv],laste=;
long long read()
{
long long data=;char ch;
while (ch<'' || ch>'') ch=getchar();
do
{
data=data*+ch-'';
ch=getchar();
}while (ch>='' && ch<='');
return data;
}
bool cmp(ask x,ask y)
{
return x.dfn<y.dfn;
}
void addedge(long long u,long long v,long long w)
{
e[++nume].v=v;
e[nume].w=w;
e[nume].nxt=g[u];
g[u]=nume;
}
void addtree(long long u,long long v,long long w)
{
tr[++numt].v=v;
tr[numt].w=w;
if (gt[u]<=laste) tr[numt].nxt=;
else tr[numt].nxt=gt[u];
gt[u]=numt;
}
void dfs(long long x)
{
dfn[x]=++times;
for (long long i=g[x];i;i=e[i].nxt)
{
long long v=e[i].v;
if (v!=anc[x][])
{
anc[v][]=x;mn[v][]=e[i].w;dis[v]=dis[x]+e[i].w;
dep[v]=dep[x]+;
dfs(v);
}
}
}
void get_table()
{
for (long long e=;e<=;e++)
for (long long i=;i<=n;i++)
{
anc[i][e]=anc[anc[i][e-]][e-];
mn[i][e]=min(mn[i][e-],mn[anc[i][e-]][e-]);
}
}
void reset()
{
top=;
}
long long lca(long long x,long long y)
{
if (dep[x]<dep[y]) swap(x,y);
for (long long e=;e>=;e--)
{
if ((dep[anc[x][e]]>=dep[y]) && (anc[x][e]))
x=anc[x][e];
}
if (x==y) return x;
for (long long e=;e>=;e--)
{
if (anc[x][e]!=anc[y][e])
{
x=anc[x][e];
y=anc[y][e];
}
}
return anc[x][];
}
long long ask(long long x,long long y)
{
long long ret=inf;
for (long long e=;e>=;e--)
{
if ((dep[anc[x][e]]>=dep[y]) && (anc[x][e]))
{
ret=min(ret,mn[x][e]);
x=anc[x][e];
}
}
return ret;
}
void dp(long long x)
{
val[x]=;
for (long long i=gt[x];i;i=tr[i].nxt)
{
long long v=tr[i].v;
if (v!=fath[x])
{
dp(v);
if (hash[v]==now_cnt) val[x]+=tr[i].w;
else val[x]+=min(val[v],tr[i].w);
}
}
}
void work()
{
k=read();
for (long long i=;i<=k;i++)
{
x=read();
q[i].pnt=x;q[i].dfn=dfn[x];
hash[x]=now_cnt;
}
sort(q+,q+k+,cmp);
stack[++top]=;
for (long long i=;i<=k;i++)
{
long long x=q[i].pnt,fr=stack[top],se=stack[top-];
long long t=lca(x,fr);
if (t==fr) stack[++top]=x;
else
{
for (;;)
{
long long ret;
fr=stack[top];se=stack[top-];
long long t=lca(x,fr);
if (dfn[t]<dfn[se]) {ret=ask(fr,se);addtree(fr,se,ret);addtree(se,fr,ret);fath[fr]=se;top--;}
else if (dfn[t]==dfn[se]) {ret=ask(fr,se);addtree(fr,se,ret);addtree(se,fr,ret);fath[fr]=se;top--;break;}
else
{
long long ret=ask(fr,t);
addtree(fr,t,ret);addtree(t,fr,ret);
stack[top]=t;fath[fr]=t;break;
}
}
stack[++top]=x;
}
}
while (top>=)
{
long long fr=stack[top],se=stack[top-],ret=ask(fr,se);
addtree(fr,se,ret);
addtree(se,fr,ret);
fath[fr]=se;
top--;
}
dp();printf("%lld\n",val[]);
laste=numt;
return;
}
int main()
{
n=read();
for (long long i=;i<=n-;i++)
{
x=read();y=read();z=read();
addedge(x,y,z);addedge(y,x,z);
}
dfs();
get_table();
m=read();
for (long long i=;i<=m;i++)
{
reset();
now_cnt=i;
work();
}
return ;
}

BZOJ 2286 消耗战的更多相关文章

  1. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  2. BZOJ 2286 消耗战 - 虚树 + 树型dp

    传送门 题目大意: 每次给出k个特殊点,回答将这些特殊点与根节点断开至少需要多少代价. 题目分析: 虚树入门 + 树型dp: 刚刚学习完虚树(好文),就来这道入门题签个到. 虚树就是将树中的一些关键点 ...

  3. BZOJ 2286: [Sdoi2011]消耗战

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

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

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

  5. 消耗战 bzoj 2286

    消耗战(2s 512MB)repair [问题描述] 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经 ...

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

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

  7. bzoj 2286(洛谷 2495) [Sdoi2011]消耗战——虚树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2286 https://www.luogu.org/problemnew/show/P2495 ...

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

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

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

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

随机推荐

  1. 有关npm rum的3个简洁技巧

    [编者按]本文作者为来自 MongoDB 的 NodeJS 工程师 Valeri Karpov.Valeri 专注于维护常见的 Mongoose ODM,是<Professional Angul ...

  2. 分布式数据存储 - MySQL双主复制

    上篇文章<分布式数据存储 - MySQL主从复制>,我们说到MySQL主从复制很好的保障了从库,读的高可用性.so,问题来了: 1.针对主库,写的高可用性又是如何做到高可用性? 2.如果需 ...

  3. iOS KVC,KVO

    链接(写得不错,着重kvc):http://www.cocoachina.com/industry/20140224/7866.html 链接:http://www.cnblogs.com/kensh ...

  4. iOS项目的完整重命名方法图文教程

    原文链接:http://www.cocoachina.com/ios/20150104/10824.html iOS项目的完整重命名方法图文教程 前言:在iOS开发中,有时候想改一下项目的名字,都会遇 ...

  5. JSX架构及注释

    一.架构 二.注释 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=&q ...

  6. android 点九PNG技术 适应不同分辨率 完美显示效果

    .9.png是一种非失真性压缩位图图形文件格式.PNG格式是非失真性压缩的,允许使用类似于GIF格式的调色板技术,支持真彩色图像,并具备阿尔法通道(半透明)等特性.现在有很多人使用PNG格式于互联网及 ...

  7. 存储入门 – RAID技术(大图解释)

    对于RAID,一直都知道个概念,但是对于细节没有去仔细的研究过.正好昨天Training的时候, 老师讲解了RAID的内容,所以顺便就整理一下.很多内容都是参考了ISMv2这本书. RAID中用到的技 ...

  8. HTML Meta标签详解

    HTML Meta中添加X-UA-Compatible和IE=Edge,chrome=1有什么作用?主题 HTML X-UA-Compatible是自从IE8新加的一个设置,对于IE8以下的浏览器是不 ...

  9. iOS:VFL语言

    VFL语言   介绍: 什么是VFL语言? VFL全称是Visual Format Language,翻译过来是“可视化格式语言” VFL是苹果公司为了简化Autolayout的编码而推出的抽象语言 ...

  10. 设置 Firewalld 防火墙控制对系统的访问

    1.检查 server101 的网卡,记住第二个网卡的名称 [root@server101 ~]# nmcli device DEVICE TYPE STATE CONNECTION br0 brid ...