题目链接 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. 洛谷 p1141 01迷宫题解

    很长时间没发博客了,今天水一下 很多dalao说染色(普通的)过不了, 我怎么就过了 其实我也是今天才知道什么是染色(由@你听风在吼 dalao指导) 然后自己打了一个,也不知道叫不叫染色,反正是过了 ...

  2. quartz测试类

    package demo.mytest; import java.text.ParseException; import org.quartz.CronTrigger;import org.quart ...

  3. IAP介绍

    iOS应用调置 wjforstudy分享了IAP的一些基本知识.在论坛的地址是:http://www.cocoachina.com/bbs/read.php?tid=92060  1.在开始IAP开发 ...

  4. TortoiseSVN文件夹及文件图标不显示解决方法---20150515

    由于自己的电脑是win7(64位)的,系统安装TortoiseSVN之后,其他的功能都能正常的使用,但是就是文件夹或文件夹的左下角就是不显示图标,这个问题前一段时间就遇到了(那个时候没找到合适的答案) ...

  5. 【贪心 思维题】[USACO13MAR]扑克牌型Poker Hands

    看似区间数据结构的一道题 题目描述 Bessie and her friends are playing a unique version of poker involving a deck with ...

  6. 如何用纯 CSS 创作一个雷达扫描动画

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/VdbGvr 可交互视频 ...

  7. 如何用纯 CSS 创作背景色块变换的按钮特效

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/XYKdwg 可交互视频教 ...

  8. SqlServer 2014该日志未截断,因为其开始处的记录是挂起的复制操作或变更数据捕获

    环境:AlwaysOn集群 操作系统:Windows Server 2008 R2 数据库: SQL Server 2014 错误提示:“该日志未截断,因为其开始处的记录是挂起的复制操作或变更数据捕获 ...

  9. Python9-内置函数2-day16

    #zip方法 l = [1,2,3] l2 = ['a','b','c'] l3 = ('*','**',[1,2]) l4 = {'k1':1,'k2':2} for i in zip(l,l2,l ...

  10. Python9-装饰器进阶-day12

    wapers方法 def wahaha(): ''' sljfldsjflds :return: ''' print('娃哈哈') print(wahaha.__name__) #查看字符串格式的函数 ...