题目链接 Hihocoder 1561

首先对原图求$MST$

我们发现某条边成为某两个点的关键路径的必要条件是这条边是最小生成树的树边。

所以我们求$MST$的同时进行启发式合并。

把$size$小的子树合并到$size$大的子树当中就可以了。

接下来是处理询问。

对于一条边,如果他不是最小生成树的树边,则答案为$0$ $0$

考虑这条边的两边的所有点。

我们先在$B$集合中求出最大的$y$

然后在$A$集合中求出最大的小于$y$的$x$

然后再在$B$集合中求出最小的大于$x$的$y$

这样就符合了题目的这个条件:

$x < y$

且如果有多个满足条件的 $x$ 和 $y$,输出其中 $x$ 最大的,如果还有多个满足条件的,输出其中 $y$ 最小的。

时间复杂度 $O(nlog^{2}n)$

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define MP make_pair
#define fi first
#define se second typedef long long LL; const int N = 2e5 + 10; int father[N], sz[N];
set <int> s[N];
int n, m;
pair <int, int> ans[N << 1]; struct node{
int x, y, z, id;
void scan(){ scanf("%d%d%d", &x, &y, &z);}
friend bool operator < (const node &a, const node &b){
return a.z < b.z;
}
} e[N << 1]; int getfather(int x){
return father[x] ? father[x] = getfather(father[x]) : x;
} void update(int i, int x, int y){
if (!s[x].size()) return;
if (!s[y].size()) return; int ny = *--s[y].end();
set <int> :: iterator it = s[x].lower_bound(ny);
if (it == s[x].begin()) return; int px = *--it;
int py = *s[y].lower_bound(px); if (px > ans[i].fi || px == ans[i].fi && py < ans[i].se) ans[i] = MP(px, py);
} int main(){ scanf("%d%d", &n, &m);
rep(i, 1, n) sz[i] = 1;
rep(i, 1, n) s[i].insert(i); rep(i, 1, m){
e[i].scan();
e[i].id = i;
} sort(e + 1, e + m + 1);
rep(i, 1, m){
int x = e[i].x, y = e[i].y;
int fa = getfather(x);
int fb = getfather(y); if (fa == fb) continue;
if (sz[fa] < sz[fb]) swap(fa, fb), swap(x, y); update(e[i].id, fa, fb);
update(e[i].id, fb, fa); for (auto it : s[fb]) s[fa].insert(it); s[fb].clear();
father[fb] = fa;
sz[fa] += sz[fb];
} rep(i, 1, m) printf("%d %d\n", ans[i].fi, ans[i].se);
return 0;
}

  

Hihocoder 1561 观光旅行(启发式合并+贪心)的更多相关文章

  1. Luogu5290 十二省联考2019春节十二响(贪心+启发式合并)

    考虑链的做法,显然将两部分各自从大到小排序后逐位取max即可,最后将根计入.猜想树上做法相同,即按上述方式逐个合并子树,最后加入根.用multiset启发式合并即可维护.因为每次合并后较小集合会消失, ...

  2. HihoCoder 1629 Graph (2017 ACM-ICPC 北京区域赛 C题,回滚莫队 + 启发式合并 + 可撤销并查集)

    题目链接  2017 ACM-ICPC Beijing Regional Contest Problem C 题意  给定一个$n$个点$m$条边的无向图.现在有$q$个询问,每次询问格式为$[l, ...

  3. [多校 NOIP 联合模拟 20201130 T4] ZZH 的旅行(斜率优化dp,启发式合并,平衡树)

    题面 题目背景 因为出题人天天被 ZZH(Zou ZHen) 吊打,所以这场比赛的题目中出现了 ZZH . 简要题面 数据范围 题解 (笔者写两个log的平衡树和启发式合并卡过的,不足为奇) 首先,很 ...

  4. BZOJ 2809: [Apio2012]dispatching( 平衡树 + 启发式合并 )

    枚举树上的每个结点做管理者, 贪心地取其子树中薪水较低的, 算出这个结点为管理者的满意度, 更新答案. 用平衡树+启发式合并, 时间复杂度为O(N log²N) ------------------- ...

  5. hdu 6133---Army Formations(启发式合并+树状数组)

    题目链接 Problem Description > Stormtroopers were the assault/policing troops of the Galactic Empire. ...

  6. 「BZOJ 2809」「APIO 2012」Dispatching「启发式合并」

    题意 给定一个\(1\)为根的树,每个点有\(c,w\)两个属性,你需要从某个点\(u\)子树里选择\(k\)个点,满足选出来的点\(\sum_{i=1}^k w(i)\leq m\),最大化\(k\ ...

  7. CF827D Best Edge Weight[最小生成树+树剖/LCT/(可并堆/set启发式合并+倍增)]

    题意:一张图求每条边边权最多改成多少可以让所有MST都包含这条边. 这题还是要考察Kruskal的贪心过程. 先跑一棵MST出来.然后考虑每条边. 如果他是非树边,要让他Kruskal的时候被选入,必 ...

  8. 牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并)

    牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并) 题意:给你一颗树,要求找出简单路径上最大权值为1~n每个边权对应的最大异或和 题解: 根据异或的性质我们可以得到 \ ...

  9. [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

随机推荐

  1. python之道06

    1,使⽤循环打印以结果: * *** ***** ******* ********* 答案: 方法一: for i in range(10): if i % 2 == 1: print(i*'*') ...

  2. Protocol(协议)、Delegate(委托)、DataSource(数据源)

    这里以 UITableViewController 和 UITableView 的关系为例: //--------------------------------------------------- ...

  3. C++系统学习之八:IO库

    新的C++标准中有三分之二的内容都是描述标准库.接下来重点学习其中几种核心库设施,这些是应该熟练掌握的. 标准库的核心是很多容器类(顺序容器和关联容器等)和一簇泛型算法(该类算法通常在顺序容器一定范围 ...

  4. 带图形桌面的CentOS7----中安装VMWareTools以及支持中文输入

    主机是WIN10操作系统 安装VMWareTools的方法:https://jingyan.baidu.com/article/e8cdb32b136ad637052bad26.html 在图形化Ce ...

  5. Python之路-基础数据类型之列表 元组

    列表的定义 列表是Python基础数据类型之一,它是以[ ]括起来, 每个元素用' , '隔开而且可以存放各种数据类型: lst = [1,2,'你好','num'] 列表的索引和切片 与字符串类似, ...

  6. Python9-模块1-day19

    在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultdict.namedtuple和Ord ...

  7. (转)TDD的iOS开发初步以及Kiwi使用入门

    本文转自“瞄神”博客 TDD的iOS开发初步以及Kiwi使用入门 测试驱动开发(Test Driven Development,以下简称TDD)是保证代码质量的不二法则,也是先进程序开发的共识.App ...

  8. cs229_part6

    part 6 接下来就是无监督学习算法了. k均值聚类 问题背景 样本集描述: \[ x\in D, x\in R^n \] 之前的有监督学习问题中,所有的x都有对应的y.但是如果我们的x没有对应的y ...

  9. 在oracle中怎么通过字段名查询其所在的表

    ora = //连接描述符名:ora (description = //描述 (address = //网络地址之一 (protocol = tcp) //网络协议(tcp表示TCP/IP协议) (h ...

  10. Login登录页面的制作流程(摘要)

    *****我的QQ号:1539832180.欢迎一起讨论学习.*****   第一步:拿到设计图,先别急着切,先分析. 因为切图不只是切图,设计不只是设计.你得考虑四方面的因素: 1. 合理的切图,语 ...