虚树裸题。

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. 在 Java EE 组件中使用 Camel Routes

    摘要:你可以通过集成 Camel 和 WildFly 应用服务器(使用 WildFly-Camel 子系统)在 Java EE 组件中开始使用 Apache Camel Routes. [编者按]作者 ...

  2. FM算法

    1.FM背景 在计算广告中,CTR预估(click-through rate)是非常重要的一个环节,因为DSP后面的出价要依赖于CTR预估的结果.在前面的相关博文中,我们已经提到了CTR中相关特征工程 ...

  3. javascript 注意事项

    1.submit input 标签的 type里的submit是提交表单的按钮 提交时应注意 为 标签加上 “name=""”字段和form标签,才能达到想要的效果  2.正则表达 ...

  4. jmeter学习预热

    对jmeter有些兴趣,最近想抽点时间熟悉下,个人熟悉某个工具的方法: 1.官网http://jmeter.apache.org/,一般官网会有Tutorials或者Getting Started之类 ...

  5. LINGO使用教程(一)

    LINGO是用来求解线性和非线性优化问题的简易工具.LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果. 1.LINGO快速入门 当你在 ...

  6. ***Jquery下Ajax与PHP数据交换

    一.前台传递字符串变量,后台返回字符串变量(非json格式) Javascript代码: 这里,为了解决Ajax数据传递出现的汉字乱码,在字符串传递之前,使用javascript函数escape()对 ...

  7. 小奇模拟赛9.13 by hzwer

    2015年9月13日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿(explo) [题目背景] 小奇要开采一些矿物,它驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞 ...

  8. C语言学习资料(转载)

    ◆经典C源程序100例:http://post.baidu.com/f?kz=8618367 ◆时钟的驻留程序:http://post.baidu.com/f?kz=10822377 ◆数据结构暨若干 ...

  9. Spring框架学习之第1节

    spring快速入门 ①   spring是什么? Struts是web框架(jsp/action/actionform) hibernate是orm框架(对象和关系映射框架),处于持久层 sprin ...

  10. 【Spring开发】—— Spring Core

    原文:[Spring开发]-- Spring Core 前言 最近由于一些工作的需要,还有自己知识的匮乏再次翻开spring.正好整理了一下相关的知识,弥补了之前对spring的一些错误认知.这一次学 ...