bzoj 3611: [Heoi2014]大工程
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #define M 2000009
- #define inf 0x7ffffff
- #define ll long long
- using namespace std;
- int n,head[M],next[M],u[M],cnt,head1[M],next1[M],u1[M],fa[M][],deep[M],m,dfn[M],T,v[M];
- int h[M],st[M],mn[M],mx[M],size[M],mx1,mi1,v1[M];
- ll cn1,sum[M];
- void jia(int a1,int a2)
- {
- cnt++;
- next[cnt]=head[a1];
- head[a1]=cnt;
- u[cnt]=a2;
- return;
- }
- void jia2(int a1,int a2)
- {
- if(a1==a2)
- return;
- cnt++;
- next1[cnt]=head1[a1];
- head1[a1]=cnt;
- u1[cnt]=a2;
- v1[cnt]=deep[a2]-deep[a1];
- return;
- }
- bool cmp(int a1,int a2)
- {
- return dfn[a1]<dfn[a2];
- }
- void dfs(int a1)
- {
- dfn[a1]=++T;
- for(int i=;(<<i)<=deep[a1];i++)
- fa[a1][i]=fa[fa[a1][i-]][i-];
- for(int i=head[a1];i;i=next[i])
- if(fa[a1][]!=u[i])
- {
- deep[u[i]]=deep[a1]+;
- fa[u[i]][]=a1;
- dfs(u[i]);
- }
- return;
- }
- int lca(int a1,int a2)
- {
- if(deep[a1]<deep[a2])
- swap(a1,a2);
- int a3=deep[a1]-deep[a2];
- for(int i=;i<=;i++)
- if(a3&(<<i))
- a1=fa[a1][i];
- for(int i=;i>=;i--)
- if(fa[a1][i]!=fa[a2][i])
- {
- a1=fa[a1][i];
- a2=fa[a2][i];
- }
- if(a1==a2)
- return a1;
- return fa[a1][];
- }
- void dp(int x){
- sum[x]=;
- mx[x]=v[x]?:-inf;
- mn[x]=v[x]?:inf;
- size[x]=v[x];
- for(int i=head1[x];i;i=next1[i]){
- int v=u1[i];
- dp(v);
- cn1+=(sum[x]+size[x]*v1[i])*size[v]+size[x]*sum[v];
- size[x]+=size[v];
- sum[x]+=sum[v]+(ll)size[v]*v1[i];
- mi1=min(mi1,mn[v]+mn[x]+v1[i]);
- mx1=max(mx1,mx[v]+mx[x]+v1[i]);
- mn[x]=min(mn[x],mn[v]+v1[i]);
- mx[x]=max(mx[x],mx[v]+v1[i]);
- }
- head1[x]=;
- }
- void solve(){
- cnt=cn1=;mi1=inf;mx1=-inf;
- int K;
- scanf("%d",&K);
- for(int i=;i<=K;i++) scanf("%d",&h[i]),v[h[i]]=;
- sort(h+,h+K+,cmp);int top=;st[]=;
- for(int i=;i<=K;i++){
- int now=h[i],f=lca(st[top],now);
- if(dfn[f]==dfn[st[top]]) st[++top]=now;
- else{
- while(top){
- int q=st[top-];
- if(dfn[q]>dfn[f]) jia2(st[top-],st[top]),top--;
- else if(dfn[q]==dfn[f]){
- jia2(q,st[top]);top--;break;
- }
- else {
- jia2(f,st[top]);st[top]=f;break;
- }
- }
- if(st[top]!=now) st[++top]=now;
- }
- }
- while(--top)jia2(st[top],st[top+]);
- dp();
- printf("%lld ",cn1);
- printf("%d %d\n",mi1,mx1);
- for(int i=;i<=K;i++) v[h[i]]=;
- }
- int main()
- {
- scanf("%d",&n);
- for(int i=;i<n;i++)
- {
- int a1,a2;
- scanf("%d%d",&a1,&a2);
- jia(a1,a2);
- jia(a2,a1);
- }
- dfs();
- scanf("%d",&m);
- for(int i=;i<=m;i++)
- solve();
- return ;
- }
虚树,树形DP
bzoj 3611: [Heoi2014]大工程的更多相关文章
- bzoj 3611 [Heoi2014]大工程(虚树+DP)
3611: [Heoi2014]大工程 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 408 Solved: 190[Submit][Status] ...
- bzoj 3611: [Heoi2014]大工程 && bzoj 2286: [Sdoi2011消耗战
放波建虚树的模板. 大概是用一个栈维护根节点到当前关键点的一条链,把其他深度大于lca的都弹出去. 每次做完记得复原. 还有sort的时候一定要加cmp!!! bzoj 3611 #include&l ...
- bzoj 3611: [Heoi2014]大工程 虚树
题目: 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 2 个国家 a,b 之间建一条新通道需要的代价为树上 ...
- 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 [Heoi2014]大工程 ——虚树
虚树第二题.... 同BZOJ2286 #include <map> #include <cmath> #include <queue> #include < ...
- 3611: [Heoi2014]大工程
3611: [Heoi2014]大工程 链接 分析: 树形dp+虚树. 首先建立虚树,在虚树上dp. dp:sum[i]为i的子树中所有询问点之间的和.siz[i]为i的子树中有多少询问点,mn[i] ...
- BZOJ2286 [Sdoi2011]消耗战 和 BZOJ3611 [Heoi2014]大工程
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6371 Solved: 2496[Submit][Statu ...
- [Bzoj3611][Heoi2014]大工程(虚树)
3611: [Heoi2014]大工程 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 2000 Solved: 837[Submit][Status ...
随机推荐
- 开始学习Angular Mobile UI
介绍 Mobile AngularUI 可以让你使用Twitter Booostrap和Angular JS来开发混合移动App和桌面应用程序. 下面是是一些贯穿整个项目的步骤,我强烈的建议你去继续阅 ...
- StringBuffer(线程安全)StringBuilder(非线程安全)
StringBuffer属于线程安全,相对为重量级 StringBuilder属于非线程安全,相对为轻量级 线程安全的概念: 网络编程中许多线程可能会同时运行一段代码.当每次运行结果和单独线程运行的结 ...
- ubuntu12.04 安装 QQ
友情提示:QQ对于第三方平台封杀已经到了丧心病狂的程度,所以不要妄想在linux的QQ能像win系统下的效果,只能祈求能用就好 1.下载QQ安装包 http://pan.baidu.com/s/1ge ...
- C++ 字符编码转换类
记录一下C++ 编码转换的函数: #pragma once #include "afx.h" #define DEFAULT_CODE 0 #define CHINESE_SIMP ...
- cocos学习笔记:快速上手
cc.Class({ //奇怪的语法风格,cc.class, extends: cc.Component, //扩展自cc.Component properties: { //类的属性设置 jumpH ...
- css清除浮动float的三种方法总结,为什么清浮动?浮动会有那些影响?一起来$('.float')
一.抛一块问题砖(display: block)先看现象: 分析HTML代码结构: <div class="outer"> <div class=&quo ...
- 实验一 DOS
实验一.DOS实验 一. 实验目的 DOS(Disk Operating System)是一个使用得十分广泛的磁盘操作系统,就连眼下流行的Windows9x/ME系统都是以它为基础 ...
- java文章显示内容部分(将html转成纯文本)
public static String splitAndFilterString(String input, int length) { if (input == null || input.tri ...
- Sublime Text 3插件安装
自动安装: 1.通过快捷键 ctrl+` 或者 View > Show Console 菜单打开控制台 2.粘贴对应版本的代码后回车安装 适用于 Sublime Text 3: import ...
- JQuery 添加节点
Mark一段自己写的添加节点的代码 function reply2(){ $( "<div class=sec1-div5>"+"<div class= ...