BZOJ 2286 消耗战
虚树裸题。
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 消耗战的更多相关文章
- BZOJ 2286 消耗战 (虚树+树形DP)
给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...
- BZOJ 2286 消耗战 - 虚树 + 树型dp
传送门 题目大意: 每次给出k个特殊点,回答将这些特殊点与根节点断开至少需要多少代价. 题目分析: 虚树入门 + 树型dp: 刚刚学习完虚树(好文),就来这道入门题签个到. 虚树就是将树中的一些关键点 ...
- BZOJ 2286: [Sdoi2011]消耗战
2286: [Sdoi2011消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2082 Solved: 736[Submit][Status] ...
- bzoj 2286: [Sdoi2011]消耗战 虚树+树dp
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 在一 ...
- 消耗战 bzoj 2286
消耗战(2s 512MB)repair [问题描述] 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经 ...
- bzoj 2286 [Sdoi2011]消耗战(虚树+树上DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2286 [题意] 给定一棵树,切断一条树边代价为ci,有m个询问,每次问使得1号点与查询 ...
- bzoj 2286(洛谷 2495) [Sdoi2011]消耗战——虚树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2286 https://www.luogu.org/problemnew/show/P2495 ...
- bzoj 3611: [Heoi2014]大工程 && bzoj 2286: [Sdoi2011消耗战
放波建虚树的模板. 大概是用一个栈维护根节点到当前关键点的一条链,把其他深度大于lca的都弹出去. 每次做完记得复原. 还有sort的时候一定要加cmp!!! bzoj 3611 #include&l ...
- BZOJ 2286: [Sdoi2011]消耗战 虚树 树形dp 动态规划 dfs序
https://www.lydsy.com/JudgeOnline/problem.php?id=2286 wa了两次因为lca犯了zz错误 这道题如果不多次询问的话就是裸dp. 一棵树上多次询问,且 ...
随机推荐
- JAVA类型信息——Class对象
JAVA类型信息——Class对象 一.RTTI概要 1.类型信息RTTI :即对象和类的信息,例如类的名字.继承的基类.实现的接口等. 2.类型信息的作用:程序员可以在程序运行时发现和使用类型信息. ...
- JS中的this好神奇,都把我弄晕了
一.this的常见判断: 1.函数预编译过程 this —> window 2.全局作用域里 this —> window 3.call/apply 可以改变函数运行时this指向 4.o ...
- 华为OJ:字符串加解密
题目描述 1.对输入的字符串进行加解密,并输出. 2加密方法为: 当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B:字母Z时则替换为a: 当内容是数字时则把该 ...
- angularJS之$apply()方法
这几天,根据buddy指定的任务,要分享一点angular JS的东西.对于一个在前端属于纯新手的我来说,Javascript都还是一知半解,要想直接上手angular JS,遇到的阻力还真是不少.不 ...
- mq_send
NAME mq_send - 将消息发送到消息队列 (REALTIME) SYNOPSIS #include <mqueue.h>int mq_send(mqd_t mqdes, cons ...
- 五分钟轻松搞定产品需求文档!这可能史上最全PRD文档模板
本文由 @JustWu 原创发布于社区 为什么写这篇文章? 第一:写PMCAFF的PRD文档,大家都是用户,比较好参考与理解,方便大家来找我写的不好的地方. 第二:我在自学PRD文档的编写过程中,总 ...
- 窗口截图(可指定HWND窗口句柄)(三篇文章)
BOOL SaveHwndToBmpFile(HWND hWnd, LPCTSTR lpszPath) { HWND hDesktop = ::GetDesktopWindow(); ASSERT(h ...
- FMX的综合评价
Cliff: 我个人觉得FMX值得学,因为可以做Mac软件,可以做Windows下的DirectUI,可以开发iOS/Android,而且是可视化开发,可利用RTL一切函数,包括可使用所有非可视控件. ...
- iOS tintColor解析
在UIView中一个相对来说比较小的属性,tintColor属性是相当的强大.今天我们就来看看如何使用他,包含使用tint color进行着色标准控件.我们自定义控件甚至重新着色图像. 本章的实例程序 ...
- CentOS下下删除大量文件
首先建立50万个文件 ➜ test for i in $(seq 1 500000);do echo text >>$i.txt;done 1. rm ➜ test time rm -f ...