刷题总结——大工程(bzoj3611)
题目:
Description
Input
第一行 n 表示点数。
Output
输出 q 行,每行三个数分别表示代价和,最小代价,最大代价。
Sample Input
2 1
3 2
4 1
5 2
6 4
7 5
8 6
9 7
10 9
5
2
5 4
2
10 4
2
5 2
2
6 1
2
6 1
Sample Output
6 6 6
1 1 1
2 2 2
2 2 2
HINT
n<=1000000
题解:
先构造虚树,为了维护答案anssum,ansmin,ansmax我们需要维护每个点i的sonsum[i],maxdis[i],mindis[i],cnt[i]分别表示该点所在子树的所有特殊点到这一点的距离总和,该点所在子树中的一个特殊点到该点距离的最大值以及最小值,和该点所在子树中的特殊点数量和···具体怎么更新三个答案和维护这四个值看代码吧
代码:
- #include<iostream>
- #include<cstdio>
- #include<cstdlib>
- #include<cmath>
- #include<ctime>
- #include<cctype>
- #include<cstring>
- #include<string>
- #include<algorithm>
- using namespace std;
- const int N=1e6+;
- inline int R()
- {
- char c;int f=;
- for(c=getchar();c<''||c>'';c=getchar());
- for(;c<=''&&c>='';c=getchar())
- f=(f<<)+(f<<)+c-'';
- return f;
- }
- int fst[N],go[N*],nxt[N*],tot,dfn[N],deep[N],g[N][],Cnt;
- int vir[N],tag[N],tmp,stack[N],top,vn,tn,par[N];
- int n,m,ansmax,ansmin,cnt[N],maxdis[N],mindis[N];
- long long anssum,sonsum[N];
- inline void comb(int a,int b)
- {
- nxt[++tot]=fst[a],fst[a]=tot,go[tot]=b;
- nxt[++tot]=fst[b],fst[b]=tot,go[tot]=a;
- }
- inline void comb1(int a,int b)
- {
- nxt[++tot]=fst[a],fst[a]=tot,go[tot]=b;
- }
- inline void dfs(int u,int fa)
- {
- dfn[u]=++Cnt;
- for(int e=fst[u];e;e=nxt[e])
- {
- int v=go[e];
- if(v==fa) continue;
- deep[v]=deep[u]+;g[v][]=u;
- dfs(v,u);
- }
- }
- inline int get(int a,int b)
- {
- int i,j;
- if(deep[a]<deep[b]) swap(a,b);
- for(i=;(<<i)<=deep[a];i++);i--;
- for(j=i;j>=;j--)
- if(deep[a]-(<<j)>=deep[b])
- a=g[a][j];
- if(a==b) return a;
- for(i=;i>=;i--)
- if(g[a][i]!=g[b][i])
- a=g[a][i],b=g[b][i];
- return g[a][];
- }
- inline void pre()
- {
- tot=stack[top=]=,tmp++,anssum=,ansmin=1e+,ansmax=;
- }
- inline bool cmp(int a,int b)
- {
- return dfn[a]<dfn[b];
- }
- inline void build()
- {
- sort(vir+,vir+vn+,cmp);
- vn=unique(vir+,vir+vn+)-vir-;tn=vn;
- for(int i=;i<=tn;i++)
- {
- if(!top)
- {
- par[vir[i]]=;stack[++top]=vir[i];fst[stack[top]]=;
- continue;
- }
- int lca=get(vir[i],stack[top]);
- while(deep[stack[top]]>deep[lca])
- {
- if(deep[stack[top-]]<deep[lca]) par[stack[top]]=lca;
- top--;
- }
- if(stack[top]!=lca)
- {
- par[lca]=stack[top];
- vir[++vn]=lca;
- stack[++top]=lca;fst[stack[top]]=;
- }
- stack[++top]=vir[i];fst[stack[top]]=;
- par[vir[i]]=lca;
- }
- sort(vir+,vir+vn+,cmp);
- }
- inline void dp(int u)
- {
- cnt[u]=(tag[u]==tmp?:);sonsum[u]=;
- maxdis[u]=;mindis[u]=(tag[u]==tmp?:1e+);
- for(int e=fst[u];e;e=nxt[e])
- {
- int v=go[e];dp(v);
- ansmin=min(ansmin,mindis[u]+mindis[v]+deep[v]-deep[u]);
- ansmax=max(ansmax,maxdis[u]+maxdis[v]+deep[v]-deep[u]);
- anssum+=(long long)cnt[u]*cnt[v]*(deep[v]-deep[u])+(long long)sonsum[u]*cnt[v]+(long long)sonsum[v]*cnt[u];
- maxdis[u]=max(maxdis[u],maxdis[v]+deep[v]-deep[u]);
- mindis[u]=min(mindis[u],mindis[v]+deep[v]-deep[u]);
- sonsum[u]+=(sonsum[v]+(long long)cnt[v]*(deep[v]-deep[u]));
- cnt[u]+=cnt[v];
- }
- }
- int main()
- {
- freopen("a.in","r",stdin);
- n=R();int a,b;
- for(int i=;i<n;i++)
- {
- a=R(),b=R();
- comb(a,b);
- }
- deep[]=;
- dfs(,);
- for(int i=;i<=;i++)
- for(int j=;j<=n;j++)
- g[j][i]=g[g[j][i-]][i-];
- m=R();
- while(m--)
- {
- vn=R();pre();
- for(int i=;i<=vn;i++) vir[i]=R(),tag[vir[i]]=tmp;
- build();
- for(int i=;i<=vn;i++) comb1(par[vir[i]],vir[i]);
- dp(vir[]);
- printf("%lld %d %d\n",anssum,ansmin,ansmax);
- }
- return ;
- }
刷题总结——大工程(bzoj3611)的更多相关文章
- 【BZOJ3611】大工程(虚树,动态规划)
[BZOJ3611]大工程(虚树,动态规划) 题面 BZOJ Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树 ...
- 【BZOJ3611】[Heoi2014]大工程 欧拉序+ST表+单调栈
[BZOJ3611][Heoi2014]大工程 Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶 ...
- [BZOJ3611][Heoi2014]大工程
[BZOJ3611][Heoi2014]大工程 试题描述 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 ...
- 【刷题】【LeetCode】000-十大经典排序算法
[刷题][LeetCode]总 用动画的形式呈现解LeetCode题目的思路 参考链接 000-十大经典排序算法
- BZOJ3611:[HEOI2014]大工程(树形DP,虚树)
Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 2 个国家 a,b 之间建一条新通 ...
- BZOJ2286 [Sdoi2011]消耗战 和 BZOJ3611 [Heoi2014]大工程
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6371 Solved: 2496[Submit][Statu ...
- BZOJ3611 [Heoi2014]大工程 【虚树】
题目 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 2 个国家 a,b 之间建一条新通道需要的代价为树上 a ...
- [BZOJ3611][Heoi2014]大工程(虚树上DP)
3611: [Heoi2014]大工程 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 2464 Solved: 1104[Submit][Statu ...
- [Bzoj3611][Heoi2014]大工程(虚树)
3611: [Heoi2014]大工程 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 2000 Solved: 837[Submit][Status ...
随机推荐
- linux程序安装及包管理
程序包的封装类型: RPM软件包:扩展名为“.rpm”,使用rpm命令安装. DEB软件包:扩展名为“.deb”,使用DPKG包管理器. 源代码软件安装:程序员开发完成的原始代码,一般制作成“.tar ...
- axios的post请求方法---以Vue示例
Axios向后端提交数据的参数格式是json,而并非用的是form传参,post表单请求提交时,使用的Content-Type是application/x-www-form-urlencoded,而使 ...
- Maven搭建Struts2+Spring3+Hibernate4框架
做了三年多的JavaEE开发了,在平时的JavaEE开发中,为了能够用最快的速度开发项目,一般都会选择使用Struts2,SpringMVC,Spring,Hibernate,MyBatis这些开源框 ...
- 基于arcgis api for js高速公路智能化智慧公路养护WebGIS开源系统
伴随着高速公路建设进程加快,其涉及信息量增大.类型多样.地点分布广,传统的信息管理方式已不适应公路建设迅速发展的需要,而目前能对高速公路在设计.施工.养护等阶段的各类信息综合进行管理的信息系统尚较少见 ...
- 01_1JAVA简介
01_1JAVA简介 1. Java基础 语法基础.OO.Exception.Array.基础类.I/O Stream.Collection /Generic.Thread.TCP/UDP.GUI.M ...
- iOS9适配总结
每年iOS升级,都会带来一些坑,这次iOS9也不例外.本文总结了微信在适配iOS9上遇到的问题和解决方案. 一.iOS9问题汇总 1. 编译问题(Bitcode) 大部分人升级到Xcode7后,首 ...
- numpy的linspace使用详解
文档地址: https://docs.scipy.org/doc/numpy/reference/generated/numpy.linspace.html Parameters(参数): start ...
- DNS 工作原理是什么,域名劫持、域名欺骗、域名污染又是什么
DNS 工作原理是什么,域名劫持.域名欺骗.域名污染又是什么 2014年11月27日 10:05:40 阅读数:6726 标签: dns网络互联网顶级域名递归 更多 个人分类: 网络学习 一.DN ...
- pandas中数据聚合【重点】
数据聚合 数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值. 数据分类处理: 分组:先把数据分为几组 用函数处理:为不同组的数据应用不同的函数以转换数据 合并:把不同组得到的结果合 ...
- Unity基础-Input接口
input 底层的设备输入接口,在开发中很少用到 Input.GetKey() // Update is called once per frame void Update () { if (Inpu ...