bzoj 3611
和BZOJ消耗站一样,先将那个询问的简图构建出来,然后就是简单的树形DP。
(倍增数组开小了,然后就狂WA,自己生成的极限数据深度又没有那么高,链又奇迹般正确)
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define oo 0x3f3f3f3f3f3f3f3f
#define N 1000010
#define P 19
using namespace std; typedef long long dnt; int n, m;
vector<int> g[N];
int dfn[N], anc[N][P+], dep[N], idc;
int head[N], ikey[N], dest[N+N], next[N+N], etot;
dnt dp[N][];
int qcnt, aa[N], stk[N], top;
dnt ans[]; void adde( int u, int v ) {
etot++;
next[etot] = head[u];
dest[etot] = v;
head[u] = etot;
}
void dfs( int u ) {
dfn[u] = ++idc;
for( int p=; p<=P; p++ )
anc[u][p] = anc[anc[u][p-]][p-];
for( int t=; t<g[u].size(); t++ ) {
int v=g[u][t];
if( v==anc[u][] ) continue;
anc[v][] = u;
dep[v] = dep[u]+;
dfs(v);
}
}
bool cmp( int u, int v ) {
return dfn[u]<dfn[v];
}
int lca( int u, int v ) {
if( dep[u]<dep[v] ) swap(u,v);
int t=dep[u]-dep[v];
for( int p=; t; t>>=,p++ )
if( t& ) u=anc[u][p];
if( u==v ) return u;
for( int p=P; p>= && anc[u][]!=anc[v][]; p-- )
if( anc[u][p]!=anc[v][p] ) u=anc[u][p], v=anc[v][p];
return anc[u][];
}
void build() {
stk[top=] = ;
head[] = ; sort( aa+, aa++qcnt, cmp ); etot = ;
for( int i=-(aa[]!=); i<=qcnt; i++ ) {
int ca=lca(aa[i],stk[top]);
while( dep[ca]<dep[stk[top]] ) {
int u;
u = stk[top--];
if( dep[ca]>=dep[stk[top]] ) {
if( ca!=stk[top] ) {
stk[++top] = ca;
head[ca] = ;
}
adde( stk[top], u );
break;
}
adde( stk[top], u );
}
stk[++top] = aa[i];
head[aa[i]] = ;
}
for( int i=top; i>=; i-- )
adde( stk[i-], stk[i] );
}
dnt sml, big, sum, cnt;
void dodp( int u ) {
if( ikey[u] ) {
dp[u][] = ;
dp[u][] = ;
dp[u][] = ;
dp[u][] = ;
} else {
dp[u][] = oo;
dp[u][] = -oo;
dp[u][] = ;
dp[u][] = ;
}
for( int t=head[u]; t; t=next[t] ) {
int v=dest[t];
dnt w=dep[v]-dep[u];
dodp(v);
dp[u][] = min( dp[u][], dp[v][]+w );
dp[u][] = max( dp[u][], dp[v][]+w );
dp[u][] += dp[v][];
dp[u][] += dp[v][]+w*dp[v][];
}
if( ikey[u] ) {
sml = ;
big = ;
sum = ;
cnt = ;
} else {
sml = oo;
big = -oo;
sum = ;
cnt = ;
}
for( int t=head[u]; t; t=next[t] ) {
int v=dest[t];
dnt w=dep[v]-dep[u];
ans[] = min( ans[], sml+w+dp[v][] );
ans[] = max( ans[], big+w+dp[v][] );
ans[] += cnt*(dp[v][]+w*dp[v][]) + sum*dp[v][];
sml = min( sml, dp[v][]+w );
big = max( big, dp[v][]+w );
cnt += dp[v][];
sum += dp[v][]+w*dp[v][];
}
}
int main() {
scanf( "%d", &n );
for( int i=,u,v; i<n; i++ ) {
scanf( "%d%d", &u, &v );
g[u].push_back( v );
g[v].push_back( u );
}
anc[][] = ;
dep[] = ;
dfs();
scanf( "%d", &m );
for( int i=; i<=m; i++ ) {
scanf( "%d", &qcnt );
for( int j=; j<=qcnt; j++ )
scanf( "%d", aa+j ); if( qcnt== ) {
printf( "0 0 0\n" );
continue;
} build(); for( int j=; j<=qcnt; j++ )
ikey[aa[j]] = ;
ans[] = oo;
ans[] = ;
ans[] = ;
dodp();
for( int j=; j<=qcnt; j++ )
ikey[aa[j]] = ; printf( "%lld %lld %lld\n", ans[], ans[], ans[] );
}
}
bzoj 3611的更多相关文章
- bzoj 3611: [Heoi2014]大工程 && bzoj 2286: [Sdoi2011消耗战
放波建虚树的模板. 大概是用一个栈维护根节点到当前关键点的一条链,把其他深度大于lca的都弹出去. 每次做完记得复原. 还有sort的时候一定要加cmp!!! bzoj 3611 #include&l ...
- bzoj 3611 [Heoi2014]大工程(虚树+DP)
3611: [Heoi2014]大工程 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 408 Solved: 190[Submit][Status] ...
- bzoj 3611(洛谷 4103) [Heoi2014]大工程——虚树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3611 https://www.luogu.org/problemnew/show/P4103 ...
- bzoj 3611: [Heoi2014]大工程
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #d ...
- bzoj 3611[Heoi2014]大工程 虚树+dp
题意: 给一棵树 每次选 k 个关键点,然后在它们两两之间 新建 C(k,2)条 新通道. 求: 1.这些新通道的代价和 2.这些新通道中代价最小的是多少 3.这些新通道中代价最大的是多少 分析:较常 ...
- BZOJ.3611.[HEOI2014]大工程(虚树 树形DP)
题目链接 要求的和.最大值.最小值好像都可以通过O(n)的树形DP做,总询问点数<=2n. 于是建虚树就可以了.具体DP见DP()函数,维护三个值sum[],mx[],mn[]. sum[]要开 ...
- 大工程(bzoj 3611)
Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 2 个国家 a,b 之间建一条新通 ...
- bzoj 3611: [Heoi2014]大工程 虚树
题目: 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 2 个国家 a,b 之间建一条新通道需要的代价为树上 ...
- BZOJ 3611 [Heoi2014]大工程 ——虚树
虚树第二题.... 同BZOJ2286 #include <map> #include <cmath> #include <queue> #include < ...
随机推荐
- 【codeforces】【比赛题解】#931 CF Round #468 (Div. 2)
因为太迟了,所以没去打. 后面打了Virtual Contest,没想到拿了个rank 3,如果E题更快还能再高,也是没什么想法. [A]Friends Meeting 题意: 在数轴上有两个整点\( ...
- ProtocolBuffer 使用及 一些坑
Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储.通信协议等方面. ProtocolBuffer的优势 跨平台: Prot ...
- MinGw 和 cygwin 的区别和联系
原创 by zoe.zhang .......................................................... 1. windows与Linux操作系统的不同 ...
- Jenkins关联GitHub进行构建
一.创建一个自由风格的项目 并在高级中勾选你构建完成后保存项目的路径 二.配置你存放代码的GitHub的地址并添加用户名密码 三.立即构建
- hibernate学习之一 框架配置
hibernate 框架 1.hibernate框架应用在javaee三层结构中的dao层框架 2.好处就是不需要写复杂jdbc代码,不需要sql语句实现 3.是开源的轻量级框架 hibernate使 ...
- win、mac系统配置本地电脑ip为域名教程
win系统: 如何修改hosts文件 主机文件原内容如下: #Copyright(c)1993-2009 Microsoft Corp. # #这是Windows的Microsoft TCP / IP ...
- java基础53 IO流技术(转换流)
1.转换流 1.输入字节的转换流:InputStreamReader是字节流转为字符流的桥梁,可以把输入字节流转换为输入字符流 2.输出字节流的转换流:OutputStreamWriter是字符 ...
- No.6 selenium学习之路之下拉框Select
HTML中,标签显示为select,有option下拉属性的为Select弹框 1.Xpath定位 Xpath语法,顺序是从1开始,编程语言中是0开始
- JQ实现情人节表白程序
JQ实现情人节表白页面 效果图: 表白利页,你值得拥有哦! 代码如下,复制即可使用: <!doctype html> <html> <head> <meta ...
- JAVA复习笔记分布式篇:kafka
前言:第一次使用消息队列是在实在前年的时候,那时候还不了解kafka,用的是阿里的rocket_mq,当时觉得挺好用的,后来听原阿里的同事说rocket_mq是他们看来kafka的源码后自己开发了一套 ...