【点分治】hdu5016 Mart Master II
点分治好题。
①手动开栈。
②dp预处理每个点被哪个市场控制,及其距离是多少,记作pair<int,int>数组p。
③设dis[u].first为u到重心s的距离,dis[u].second=u,到在统计的时候,若dis[u]<=(p[v].first-dis[v].first,p[v].second)(双关键字比较),则符合题意,当然这样在计算同一颗子树里的答案时,是压根不对的,但是既然这部分反正是要被减掉的,那就将错就错地计算即可了。
④最后在所有原非市场节点的ans中取一个最大的即可。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
using namespace std;
#define MAXN 100001
#define INF 1000000000
typedef pair<int,int> Point;
Point td[MAXN],ds[MAXN],p[MAXN],td2[MAXN],ds2[MAXN];
bool is[MAXN];
int n,K,ans[MAXN],en2,en3;
int v[MAXN<<],w[MAXN<<],first[MAXN],next[MAXN<<],en;
void AddEdge(const int &U,const int &V,const int &W)
{
v[++en]=V;
w[en]=W;
next[en]=first[U];
first[U]=en;
}
bool centroid[MAXN];
int size[MAXN];
int calc_sizes(int U,int Fa)
{
int res=;
for(int i=first[U];i;i=next[i])
if(v[i]!=Fa&&(!centroid[v[i]]))
res+=calc_sizes(v[i],U);
return size[U]=res;
}
Point calc_centroid(int U,int Fa,int nn)
{
Point res=make_pair(INF,-);
int sum=,maxv=;
for(int i=first[U];i;i=next[i])
if(v[i]!=Fa&&(!centroid[v[i]]))
{
res=min(res,calc_centroid(v[i],U,nn));
maxv=max(maxv,size[v[i]]);
sum+=size[v[i]];
}
maxv=max(maxv,nn-sum);
res=min(res,make_pair(maxv,U));
return res;
}
void calc_dis(int U,int Fa,int d)
{
td[en2++]=make_pair(d,U);
for(int i=first[U];i;i=next[i])
if(v[i]!=Fa&&(!centroid[v[i]]))
calc_dis(v[i],U,d+w[i]);
}
void calc_pairs(Point dis[],Point dis2[],int En,int op)
{
sort(dis2,dis2+En);
for(int i=;i<En;++i)
ans[dis[i].second]+=(dis2+En-lower_bound(dis2,dis2+En,dis[i]))*op;
}
void solve(int U)
{
calc_sizes(U,-);
int s=calc_centroid(U,-,size[U]).second;
centroid[s]=;
for(int i=first[s];i;i=next[i])
if(!centroid[v[i]])
solve(v[i]);
en3=;
ds[en3]=make_pair(,s);
ds2[en3++]=make_pair(p[s].first,p[s].second);
for(int i=first[s];i;i=next[i])
if(!centroid[v[i]])
{
en2=; calc_dis(v[i],s,w[i]);
for(int i=;i<en2;++i)
td2[i]=make_pair(p[td[i].second].first-td[i].first,p[td[i].second].second);
calc_pairs(td,td2,en2,-);
memcpy(ds+en3,td,en2*sizeof(Point));
memcpy(ds2+en3,td2,en2*sizeof(Point));
en3+=en2;
}
calc_pairs(ds,ds2,en3,);
centroid[s]=;
}
void init()
{
memset(ans,,(n+)*sizeof(int));
memset(first,,(n+)*sizeof(int));
en=;
}
void dfs1(int U,int Fa)
{
for(int i=first[U];i;i=next[i])
if(v[i]!=Fa)
{
p[v[i]]=min(p[v[i]],make_pair(p[U].first+w[i],p[U].second));
dfs1(v[i],U);
}
}
void dfs2(int U,int Fa)
{
for(int i=first[U];i;i=next[i])
if(v[i]!=Fa)
{
dfs2(v[i],U);
p[U]=min(p[U],make_pair(p[v[i]].first+w[i],p[v[i]].second));
}
}
int main()
{
int a,b,c;
while(scanf("%d",&n)!=EOF)
{
init();
for(int i=;i<n;++i)
{
scanf("%d%d%d",&a,&b,&c);
AddEdge(a,b,c);
AddEdge(b,a,c);
}
for(int i=;i<=n;++i)
{
scanf("%d",&is[i]);
if(!is[i]) p[i]=make_pair(INF,INF);
else p[i]=make_pair(,i);
}
dfs2(,-);
dfs1(,-);
solve();
int Ans=;
for(int i=;i<=n;++i) if(!is[i]) Ans=max(Ans,ans[i]);
printf("%d\n",Ans);
}
return ;
}
【点分治】hdu5016 Mart Master II的更多相关文章
- HDU 5016 Mart Master II
Mart Master II Time Limit: 6000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ...
- HDU 5016 Mart Master II (树上点分治)
题目地址:pid=5016">HDU 5016 先两遍DFS预处理出每一个点距近期的基站的距离与基站的编号. 然后找重心.求出每一个点距重心的距离.然后依据dis[x]+dis[y] ...
- 算法学习分析-点分治 HDU 6269 Master of Subgraph
首先给出定义 点分治是一种处理树上路径的工具 挂出一道题目来:Master of Subgraph 这道题目让你求所有联通子图加和所能产生数字,问你1到m之间,那些数字可以被产生 这道题目,假如我们利 ...
- hdu 5016 点分治(2014 ACM/ICPC Asia Regional Xi'an Online)
Mart Master II Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- HDU 4916 树分治
Mart Master II Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 【SpringBoot】SpringBoot 入门示例
参考资料: http://www.tuicool.com/articles/mqeee2A http://www.cnblogs.com/suncj/p/4065589.html http://spr ...
- 【架构】SpringCloud 注册中心、负载均衡、熔断器、调用监控、API网关示例
示例代码: https://github.com/junneyang/springcloud-demo 参考资料: SpringCloud系列 Eureka 一句话概括下spring框架及spring ...
- Bryce1010 Acm模板
目录 STL标准模板库 STL简介 STL pair STL set STL vector STL string STL stack STL queue STL map upper_bound和low ...
- Mac下OpenCV开发
1. 环境搭建 a) 安装Homebrew i. 下载地址:http://github.com/mxcl/homebrew/tarball/maste ...
随机推荐
- Codeforces Round #531 (Div. 3) ABCDEF题解
Codeforces Round #531 (Div. 3) 题目总链接:https://codeforces.com/contest/1102 A. Integer Sequence Dividin ...
- Ecplise添加XML自动提示
这里以struts.xml为例 第一步: 首先找到 struts2的核心jar包,我这里是struts2-core-2.3.20.jar用压缩工具打开或者解压下来
- 使用mysqldump命令备份恢复MySQL数据库
1.各种用法说明 A. 最简单的用法: mysqldump -uroot -pPassword [database name] > [dump file] 上述命令将指定数据库备份到某dump文 ...
- javascript中arguments的应用——不定项传参求和
<script type="text/javascript"> window.onload=function(){ function sum(){ var result ...
- 图论:KM算法
如果,将求二分图的最大匹配的所有匹配边的权重看做1 那么用匈牙利算法求二分图的最大匹配的问题也可以看成求二分图的最大权匹配 如果边权是特例,我们就要使用KM算法来做了 这个算法其实还是比较难的,会用就 ...
- 【转】vs2015一键卸载干净
插件是国外的一位同行写的,偶然在网上发现感觉挺好用,分享一下. 第二步.下载工具并解压 网盘下载地址:https://pan.baidu.com/s/1eSHRYxW 也可以在Github上下载最新版 ...
- sphinx 分词搭建手册
步奏1. yum install make gcc g++ gcc-c++ libtool autoconf automake imake mysql-devel libxml2-devel expa ...
- Linux内核完全剖析基于0.12内核
控制寄存器(CR0,CR1,CR2,CR3)用于控制和确定处理器的操作模式以及当前执行任务的特性.CR0中含有控制处理器操作模式和状态的系统控制标志,CR1保留不用,CR2含有导致页错误的线性地址,C ...
- logging模块的使用
# -*- coding: utf-8 -*- import os import time import logging import sys log_dir1=os.path.join(os.pat ...
- 3.flume安装以及环境配置
1.安装jdk 我这里已经安装过了,这里就不演示了 2.安装flume 安装cdh版本的,http://archive.cloudera.com/cdh5/cdh/5/ 安装完毕之后,配置环境变量. ...