[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名是外籍飞行员.在众多的飞行员中, ...
随机推荐
- Servlet小总结
Servlet Servlet(服务器端小程序)是使用Java语言编写的服务器端程序,像JSP一样,生成动态的Web页.Servlet主要运行在服务器端,并由服务器调用执行. Servlet处理的基本 ...
- [UWP]了解IValueConverter
1. 前言 IValueConverter是用于数据绑定的强大的武器,它用于Value在Binding Source和Binding Target之间的转换.本文将介绍IValueConverter的 ...
- NOI2001 炮兵阵地
一道非常有意思的题目 很久之前考过 但那时候好像只会打裸搜索(捂脸跑 后来看题解的时候也是没有学状压的所以算是闲置了很久没动的题 昨天看到的时候第一反应是m<=10所以压m然后跑1-n枚举每一行 ...
- git正确的删除远程仓库的文件并用.gitignore忽略提交此文件
我向远程仓库提交了如下文件src/ pom.xml target/ WebContent/,发现没必要提交target目录. 于是做了如下操作: git rm -r --cached target g ...
- 用node搭建简单的静态资源管理器
我们都知道,老牌的3p服务器都是自带静态资源管理器的.但是node不同,它没有web容器,它的路由地址和真实地址可以没有联系,所有node的优点,是可以把路由做得相当漂亮. 但静态资源管理器也是必不可 ...
- C# Excel数据导入到数据库
http://www.jb51.net/article/44743.htm 假如Excel中的数据如下: 数据库建表如下: 其中Id为自增字段: 代码: 复制代码 代码如下: using System ...
- java juint框架的windows自动化-自动运行juint程序简述
在京东混了一个月,基本有点稳定了,觉得也有所余力了现在,继续写博客吧,不过以后更新也许不是那么频繁了 本人使用的是juint框架,对开发是一个单元测试的java框架,但是对测试而言是java的基石之一 ...
- ubuntu更换阿里源
网上应该可以找到很多关于ubuntu源的设置方法,但是如果不搞清楚就随便设置的话,不仅不能起到应有的效果,还会由于一些问题导致apt不可用. 最正确的更换源的方法应该如系统提示的: ## a.) ad ...
- leetcode — copy-list-with-random-pointer
import java.util.*; /** * * Source : https://oj.leetcode.com/problems/copy-list-with-random-pointer/ ...
- Protobuf的简单介绍、使用和分析
Protobuf的简单介绍.使用和分析 一.protobuf是什么? protobuf(Google Protocol Buffers)是Google提供一个具有高效的协议数据交换格式工具库( ...