Hihocoder 1561 观光旅行(启发式合并+贪心)
题目链接 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 观光旅行(启发式合并+贪心)的更多相关文章
- Luogu5290 十二省联考2019春节十二响(贪心+启发式合并)
考虑链的做法,显然将两部分各自从大到小排序后逐位取max即可,最后将根计入.猜想树上做法相同,即按上述方式逐个合并子树,最后加入根.用multiset启发式合并即可维护.因为每次合并后较小集合会消失, ...
- HihoCoder 1629 Graph (2017 ACM-ICPC 北京区域赛 C题,回滚莫队 + 启发式合并 + 可撤销并查集)
题目链接 2017 ACM-ICPC Beijing Regional Contest Problem C 题意 给定一个$n$个点$m$条边的无向图.现在有$q$个询问,每次询问格式为$[l, ...
- [多校 NOIP 联合模拟 20201130 T4] ZZH 的旅行(斜率优化dp,启发式合并,平衡树)
题面 题目背景 因为出题人天天被 ZZH(Zou ZHen) 吊打,所以这场比赛的题目中出现了 ZZH . 简要题面 数据范围 题解 (笔者写两个log的平衡树和启发式合并卡过的,不足为奇) 首先,很 ...
- BZOJ 2809: [Apio2012]dispatching( 平衡树 + 启发式合并 )
枚举树上的每个结点做管理者, 贪心地取其子树中薪水较低的, 算出这个结点为管理者的满意度, 更新答案. 用平衡树+启发式合并, 时间复杂度为O(N log²N) ------------------- ...
- hdu 6133---Army Formations(启发式合并+树状数组)
题目链接 Problem Description > Stormtroopers were the assault/policing troops of the Galactic Empire. ...
- 「BZOJ 2809」「APIO 2012」Dispatching「启发式合并」
题意 给定一个\(1\)为根的树,每个点有\(c,w\)两个属性,你需要从某个点\(u\)子树里选择\(k\)个点,满足选出来的点\(\sum_{i=1}^k w(i)\leq m\),最大化\(k\ ...
- CF827D Best Edge Weight[最小生成树+树剖/LCT/(可并堆/set启发式合并+倍增)]
题意:一张图求每条边边权最多改成多少可以让所有MST都包含这条边. 这题还是要考察Kruskal的贪心过程. 先跑一棵MST出来.然后考虑每条边. 如果他是非树边,要让他Kruskal的时候被选入,必 ...
- 牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并)
牛客2018国庆集训 DAY1 D Love Live!(01字典树+启发式合并) 题意:给你一颗树,要求找出简单路径上最大权值为1~n每个边权对应的最大异或和 题解: 根据异或的性质我们可以得到 \ ...
- [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)
Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...
随机推荐
- VC-基础:VC++动态链接库(DLL)编程深入浅出
1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量.函数或类.在仓库的发展史上经历了“无库-静 ...
- 使用bat脚本调用py文件直接获取应用的包名和targetversion
背景: 在上一篇已经介绍过如何利用python调用aapt获取包名 https://www.cnblogs.com/reseelei-despair/p/11078750.html 但是因为每次都要修 ...
- shell脚本,按空格开始60秒的倒计时。
[root@localhost wyb]# cat space.sh #!/bin/bash #按空格开始60秒的倒计时#-n表示接受字符的数量,1表示只接受一个字符 a() { - ` do ec ...
- MFC编辑框换行
字符串结尾加上"\r\n": 编辑框属性设置:Auto HScroll为False,Multiline为True,Want Return为True. =============== ...
- luoguP1164 小A点菜(背包问题)
题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过uim由于买了一些辅(e ...
- mysql查询数据包太大:max_allowed_packet
查询大小: show variables like '%max_allowed_packet%'; 修改大小: set global max_allowed_packet = 1024 * 1024 ...
- (25)zabbix事件通知
概述 我们前面花了大量时间去讲解item.trigger.event都是为发送报警做准备的,什么是事件通知呢?简单的说故障发生了,zabbix会发邮件或者短信给你,告诉你服务器的一些状况. 如果没有通 ...
- 【php】 get 和 post 比较
来源 php.net 评论区 -- nucc1 worth clarifying: POST is not more secure than GET. The reasons for choosing ...
- 分享读C Primer Plus时遇到的一个问题(补档5月7日)
最近在学习C Primer Plus.书中第66页,3.8 关键概念 这一小节中有这一段话: “计算机中的浮点数和整数在本质上不同,其存储方式和运算过程有很大区别.即使两个 32 位存储单元存储的位组 ...
- python--MySQL权限管理 数据备份还原
一 权限管理 mysql最高管理者是root用户, 这个一般掌握在公司DBA手里, 当你想去对数据库进行一些操作的时候,需要DBA授权给你. 1. 对新用户增删改 1. 创建用户 # 要先use my ...