虚树裸题。

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. main函数和启动例程

    为什么汇编程序的入口是_start,而C程序的入口是main函数呢?本节就来解释这个问题.在讲例 18.1 “最简单的汇编程序”时,我们的汇编和链接步骤是: $ as hello.s -o hello ...

  2. IE6 png 透明--四种解决方法

    FF和IE7已经直接支持透明的png图了,下面这个主要是解决IE6下透明PNG图片有灰底的 方法一:定义一个样式,给某个div应用这个样式后,div的透明png背景图片自动透明了.(注意两处图片的路径 ...

  3. uva 11324

    Problem B: The Largest Clique Given a directed graph G, consider the following transformation. First ...

  4. ubuntu第一次设置root密码

    安装ubuntu时,系统让用户创建了一个非root用户,系统启动后使用这个用户,在需要执行超级用户权限的指令时,可以通过sudo来执行.为此我们可以通过这样的方式修改root的密码:dengfei@d ...

  5. PHP 字符串函数--替换、正则匹配等

    名称 支持正则 特 点 备注 str_replace X 字符串替换函数,大小写敏感   str_ireplace X 字符串替换函数,大小写不敏感,支持数组式批量替换 感谢网友franci, 提醒添 ...

  6. <?php $sql = <<<EOF 。。。。EOF;?>这种写法是什么意思

    php里$sql = <<<EOF //有这样的语法??????//sql语句EOF;运行mysql_query($sql)?>这是什么语法?变量声明可以这样的结构?请解答,谢 ...

  7. linux登陆欢迎提示信息的设置

    Linux可以设置登录前后的欢迎信息,虽然没啥技术含量,但却是非常实用的一个小技巧. 实现登录消息的功能,可以修改3个文件. 1./etc/issue 本地登陆显示的信息,本地登录前 2./etc/i ...

  8. unity 脚本(自定义组件)的事件触发关系

  9. Protobuf动态解析那些事儿

    需求背景 在接收到 protobuf 数据之后,如何自动创建具体的 Protobuf Message 对象,再做反序列化.“自动”的意思主要有两个方面:(1)当程序中新增一个 protobuf Mes ...

  10. 解决IIS应用程序池DefaultAppPool关闭超时错误

    错误系统日志: 为应用程序池“DefaultAppPool”提供服务的进程关闭时间超过了限制.进程 ID 是“3060”. 有关更多信息,请参阅在http://go.microsoft.com/fwl ...