题目大意
有 个大小不同的圆盘(编号 ,编号越大盘越大),初始时它们以任意方式套叠在三根柱子 上(输入给出每根柱子从上到下的圆盘编号;用 0 表示空)。
同样给出一个目标状态。要求在满足:
-
每次只能移动一个圆盘
-
不能把大盘放在小盘上
的前提下,用最少步数把初始状态变到目标状态。
输出每一步操作 move I from P to Q,最后输出最少步数。
63pts, 期待以后的自己
1 |
|
有 n 个大小不同的圆盘(编号 1simn,编号越大盘越大),初始时它们以任意方式套叠在三根柱子 A,B,C 上(输入给出每根柱子从上到下的圆盘编号;用 0 表示空)。
同样给出一个目标状态。要求在满足:
每次只能移动一个圆盘
不能把大盘放在小盘上
的前提下,用最少步数把初始状态变到目标状态。
输出每一步操作 move I from P to Q,最后输出最少步数。
63pts, 期待以后的自己
1 | #include <iostream> |
这篇笔记对应的是「set 自定义 cmp 排序」:讲的是在 C++ 里如何为 set(以及类似容器)自定义比较器 cmp,从而改变元素的排序规则(例如从大到小排序),以及与默认比较方式的区别。
1 | #include <iostream> |
1 | 4 |
优先队列的比较符号是反的,解释详情见
https://www.nowcoder.com/discuss/353157988535967744
1 | #include <iostream> |
1 | 1 1 |
Wine 如何打开devcpp
wine “/Users/zzy/.wine/drive_c/Program Files (x86)/Dev-Cpp/devcpp.exe”
维护一个动态可重集合 M,需要支持以下操作:
插入一个数 x。
删除一个数 x(若有多个相同值,只删除一个)。
查询集合中严格小于 x 的元素个数,并将结果加 1 输出。
查询集合按从小到大排序后,第 x 小的数。
查询 x 的前驱:小于 x 且最大的数(不保证 x 在集合中,但保证答案存在)。
查询 x 的后继:大于 x 且最小的数(不保证 x 在集合中,但保证答案存在)。
主要是发现此题寻找第k大的连通块需要平衡二叉树,不学不行,故来学习。
参考博客
https://writings.sh/post/fhq-treap
其他OJ
参考视频
1 | #include<bits/stdc++.h> |
有 n 座岛(编号 1simn),每座岛有一个“重要度排名” pi(是 1∼n 的一个排列,数值越小表示越重要)。初始有 m 座桥形成无向图,之后还会有 q 次操作:
B x y:在岛 x 与 y 之间新建一座桥。
Q x k:在当前与岛 x 连通的所有岛中,找出“重要度排名第 k 小”的岛,输出该岛编号;若不存在则输出 −1。
1 |
40pts,TLE,不用平衡树stl的set合并太慢了。
1 | //https://www.luogu.com.cn/problem/P3224 |