[51nod][cf468D]1558 树中的配对
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1558
不是很懂dalao们用线段树是怎么写的……
反正找出重心以后每个子树一个堆,再来个全局堆就吼了
#include<queue>
#include<stdio.h>
#include<algorithm>
#define MN 100001
using namespace std; int read_p,read_ca;
inline int read(){
read_p=;read_ca=getchar();
while(read_ca<''||read_ca>'') read_ca=getchar();
while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
return read_p;
}
struct na{int y,z,ne;}b[MN<<];
struct ma{int x,y;ma(int _x=,int _y=):x(_x),y(_y){}};
bool operator < (ma a,ma b){return a.x<b.x;}
priority_queue<ma> q[MN],Q,_q;
int n,m,l[MN],x,y,z,ro,mi=1e9,si[MN],nm=,num=,be[MN];
long long MMH;
inline void in(int x,int y,int z){b[++num].y=y;b[num].z=z;b[num].ne=l[x];l[x]=num;}
inline int min(int a,int b){return a<b?a:b;}
int dfs(int x,int f){
int S=,s,u=;
for (register int i=l[x];i;i=b[i].ne)
if (b[i].y!=f){
s=dfs(b[i].y,x);
if (u<s) u=s;
S+=s;
MMH+=1LL*b[i].z*min(s,n-s);
}
if (n-S>u) u=n-S;
if (u<mi) ro=x,mi=u;
return S;
}
void DFS(int x,int f,int d){
q[d].push(ma{-x,d});si[d]++;be[x]=d;
for (register int i=l[x];i;i=b[i].ne)
if (b[i].y!=f) DFS(b[i].y,x,d);
}
int work(int u){
while (_q.top().x!=q[_q.top().y].top().x||q[_q.top().y].empty()) _q.pop();
ma o;
if (_q.top().y==u) o=_q.top(),_q.pop();
while (_q.top().x!=q[_q.top().y].top().x||q[_q.top().y].empty()) _q.pop();
u=_q.top().y;
if (o.x) _q.push(o);
return u;
}
int main(){
register int i;
n=read();
if (n==) return puts("0\n1"),;
for (i=;i<n;i++) x=read(),y=read(),z=read(),in(x,y,z),in(y,x,z);
dfs(,);
q[].push(ma{-ro,});_q.push(ma{-ro,});si[]=;
for (i=l[ro];i;i=b[i].ne)
DFS(b[i].y,ro,++nm),Q.push(ma{si[nm]<<,nm}),_q.push(ma(q[nm].top().x,nm));
printf("%lld\n",MMH<<);
for (i=;i<=n;i++){
while (Q.top().x!=si[Q.top().y]+q[Q.top().y].size()) Q.pop();
if (be[i]==Q.top().y||Q.top().x<n-i+) m=work(be[i]);else m=Q.top().y;
if (i==ro&&-q[m].top().x>ro&&!q[].empty()&&Q.top().x<n-i+) m=;
printf("%d ",-q[m].top().x);
q[m].pop();si[be[i]]--;if (!q[m].empty())_q.push(ma(q[m].top().x,m));
Q.push(ma(si[m]+q[m].size(),m));Q.push(ma(si[be[i]]+q[be[i]].size(),be[i]));
}
}
[51nod][cf468D]1558 树中的配对的更多相关文章
- 51Nod 1558 树中的配对
题目链接 分析: 想了好久~~~还是得看题解...QwQ 首先因为是排列,所以我们猜想要把式子拆开来看, $ \sum dis(i,p[i])=\sum dep[i]+dep[p[i]]-2*dep[ ...
- 「题解」「CF468D」树中的配对
目录 题目大意 思路 源代码 本博客除代码之外,来自 skylee 大佬. 题目大意 一棵\(n(n\le10^5)\)个编号为\(1\sim n\)的点的带边权的树,求一个排列\(p_{1\sim ...
- 51Nod 2006 飞行员配对(二分图最大匹配)
链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=2006 思路: 二分匹配 注意n m的关系 代码: #include ...
- 51Nod 2006 飞行员配对(二分图最大匹配)
第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2名飞行员,其中1名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中, ...
- 51Nod 1737 配对(树的重心)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1737 题意: 思路: 树的重心. 树的重心就是其所以子树的最大的子树结点 ...
- 51nod 2006 飞行员配对
第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2名飞行员,其中1名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中, ...
- 51Nod 2006 飞行员配对(二分图最大匹配)-匈牙利算法
2006 飞行员配对(二分图最大匹配) 题目来源: 网络流24题 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 第二次世界大战时期,英国皇家空军从沦陷国 ...
- 51nod 1737配对
题意:给定一个n个点的带边权树, 保证n是偶数,给这个树两两配对,使得配对后的点路径和最大,输出最大值. 其实是个很简单的题,但还是被绊了.这充分说明现在连简单题都做不来了555 单独考虑每条边.每 ...
- (二分图最大匹配)51NOD 2006 飞行员配对
第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2名飞行员,其中1名是英国飞行员,另1名是外籍飞行员.在众多的飞行员中, ...
随机推荐
- ASP.NET Core 一步步搭建个人网站(3)_菜单管理
上一章,我们实现了用户的注册和登录,登录之后展示的是我们的主页,页面的左侧是多级的导航菜单,定位并展示用户需要访问的不同页面.目前导航菜单是写死的,考虑以后菜单管理的便捷性,我们这节实现下可视化配置菜 ...
- ed命令
- 【ANT】一个简单的ANT生成文件build.xml
<?xml version="1.0" ?> <project default="test"> <target name=&quo ...
- 网友"就像一支烟"山寨币分析估值方法
[注:素材取自QQ群,2017年12月28日的聊天记录."就像一支烟"分享了自己的山寨币分析估值方法.因为删去了其他人的聊天记录,部分文字可能断章取义,仅供参考,具体情况请自行分析 ...
- 对Spring与SpringMVC的理解
Spring 在我的Spring --简介及环境搭建跑通Hello提到关于Spring的基本结构与功能 SpringMVC 先上一张SpringMVC的流程图 Spring MVC 是一个模型 - 视 ...
- geoserver发布地图服务WMTS
WMTS: 切片地图web服务(OpenGIS Web Map Tile Service) WMTS提供了一种采用预定义图块方法发布数字地图服务的标准化解决方案.WMTS弥补了WMS不能提供分块地图的 ...
- Android破解学习之路(五)——Android游戏 割绳子:魔法 + 在游戏加入Toast弹窗提示
前言:这一期的破解教程,有新的知识内容出现啦! 这一期破解的游戏是找不到之前的关键字,怎么破解呢? 破解成功之后,添加一个Toast弹窗提示由XX破解,这操作该如何实现呢?请往下看~ 链接: http ...
- JS如何实现导航栏的智能浮动
<script language="javascript"> function smartFloat(obj) { var obj = docu ...
- openstack操作之一 命令行
在openstack环境中提供了多种操作虚拟机的方法,有最简单直接的dashborad界面,有不直观但高效的命令行,还有进阶版的postman调用openstack restfulapi和命令行中使用 ...
- IT小白学习Discuz!框架(一)
1.Discuz!是什么? 答:(1).Crossday Discuz! Board(简称 Discuz!)是北京康盛新创科技有限责任公司推出的一套通用的社区论坛软件系统. (2).Crossday ...