
【数据结构】堆
cz_xuyixuan
这个作者很懒,什么都没留下…
展开
-
【BZOJ5102】【POI2018】Prawnicy
【题目链接】点击打开链接【思路要点】从左到右枚举交集的左端点,用堆维护最大的\(K\)个右端点即可。时间复杂度\(O(NLogN)\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 1000005;template <typename T> void chkmax(T &x, T...原创 2018-03-18 19:42:05 · 313 阅读 · 0 评论 -
【USACO】2019 January Contest, Platinum题解
**【T1】**Redistricting【题目链接】点击打开链接【题解链接】点击打开链接【思路要点】将 GGG 看做 +1+1+1 , HHH 看做 −1-1−1 ,记原数组前缀和为 sis_isi 。则可以得到动态规划 dpi=∑j=1kdpi−j+[si−si−j≥0]dp_{i}=\sum_{j=1}^{k}dp_{i-j}+[s_i-s_{i-j}≥0...原创 2019-01-25 21:23:06 · 1113 阅读 · 0 评论 -
【UOJ455】【UER #8】雪灾与外卖
【题目链接】点击打开链接【思路要点】首先判断是否无解,以下讨论默认问题有解。令 ∞\infty∞ 为一个足够大的数,对于送餐员 XiX_iXi ,在 Xi−∞X_i-\inftyXi−∞ 处增加 111 个餐馆,令所有送餐员初始时与其对应的餐馆匹配,即初始时 Ans=N∗∞Ans=N*\inftyAns=N∗∞ 。从左到右考虑每一个元素,加入当前的考虑集合。若加入元素为...原创 2019-01-28 14:36:00 · 1088 阅读 · 0 评论 -
【CodeChef】Graph on a Table
【题目链接】点击打开链接【思路要点】注意到一步使得两维坐标均增大 222 或以上的走法一定是不优的,我们只需要考虑每一步某一维增量为 111 的情况。预处理 Li,j,Ui,jL_{i,j},U_{i,j}Li,j,Ui,j 分别表示最左侧的可以转移到 (i,j)(i,j)(i,j) 的位置和最上方的可以转移到 (i,j)(i,j)(i,j) 的位置,可以发现, Li,jL...原创 2019-04-18 16:01:57 · 277 阅读 · 0 评论 -
【省内训练2019-06-01】颁奖
【思路要点】较为简单的模拟费用流问题。可以参考 WC2019WC2019WC2019 第一课堂陈江伦的《模拟费用流问题》课件。时间复杂度 O(NLogN)O(NLogN)O(NLogN) 。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 2e5 + 5;const long lon...原创 2019-06-05 12:51:36 · 467 阅读 · 0 评论 -
【LOJ3048】「十二省联考 2019」异或粽子
【题目链接】点击打开链接【思路要点】前缀和后用可持久化线段树可以计算出各个右端点对应的最优的左端点,并且可以实现在某一个左端点集合中单点删除。用堆维护全局最优值,每找到一个便将其在对应的线段树中删除即可。时间复杂度 O(NLogV+KLogV)O(NLogV+KLogV)O(NLogV+KLogV) 。【代码】#include<bits/stdc++.h>...原创 2019-06-17 20:37:59 · 325 阅读 · 0 评论 -
【LOJ3052】「十二省联考 2019」春节十二响
【题目链接】点击打开链接【思路要点】显然不同的子树分组相互独立,而根节点自成一组,因此合并子树应当将大小较大的块依次合并,并且可以用归纳法证明该策略的最优性。用堆维护各个块的大小,合并时采用启发式合并即可。时间复杂度等同于长链剖分的复杂度,为 O(NLogN)O(NLogN)O(NLogN) 。【代码】#include<bits/stdc++.h>us...原创 2019-06-17 21:04:29 · 346 阅读 · 0 评论 -
【校内训练2019-07-09】探险队
【思路要点】考虑计算 fif_ifi 表示到达点 iii 后发现 iii 的一条邻边断开,最坏情况下到达 TTT 的的最短路。注意到图是无向图,可以从 TTT 出发建立一棵最短路树,则最坏情况显然是断开 iii 的父边的情况。枚举一条非树边 (x,y,w)(x,y,w)(x,y,w) ,则对于 x,yx,yx,y 路径上的一个非 Lca(x,y)Lca(x,y)Lca(x,y) 的点 ...原创 2019-07-09 14:23:05 · 401 阅读 · 0 评论 -
【省内训练2019-06-30】Gym
【思路要点】考虑 rrr 互不相同的情况。rrr 互不相同意味着如果按照天数顺序处理,只要不拖过右端点,我们就始终能够完成订单。那么可以考虑拖得尽可能久,这样就有机会一次性处理更多的订单。处理订单时优先处理右端点靠左的订单即可,需要用堆维护订单集合,并用 setsetset 维护器材集合。对于 rrr 可能相同的情况,可以将 rrr 相同的区间保留最短者,其余区间的 rrr 均减去 ...原创 2019-06-30 14:18:43 · 287 阅读 · 0 评论 -
【LOJ3158】「NOI2019」序列
【题目链接】点击打开链接【思路要点】笔者本题的做法是基于对决策点进行打表得到的,并不能给出严格的证明。但确实得到了一个与标准解法,或是模拟费用流解法完全不同的做法。考虑一个 O(N3)O(N^3)O(N3) 的动态规划,将数组按照 aia_iai 排序,那么一旦确定了 LLL 对都选的位置,剩余的 K−LK-LK−L 个选择 aia_iai 的位置一定是一个前缀。因此,我...原创 2019-07-31 13:58:28 · 1059 阅读 · 0 评论 -
【CodeForces】CodeForces Round #530 (Div. 1) 题解
【比赛链接】点击打开连接【题解链接】点击打开链接**【A】**Sum in the tree【思路要点】题目中给出的限制条件相当于限定了所有深度为奇数的点及其父亲的权值和,显然,将深度为偶数的非叶节点的权值设置得尽可能大有利于减少全局权值和。时间复杂度 O(N)O(N)O(N) 。【代码】#include&lt;bits/stdc++.h&gt;usi...原创 2019-01-20 11:30:34 · 651 阅读 · 0 评论 -
【校内训练2019-01-18】排列
【思路要点】最大值一定是最高的存在差异的位为 111 和 000 的两个数异或得到。把所有数字分成两个集合 S0,S1S_0,S_1S0,S1,其中 S0S_0S0 是该位为 000 的数的集合, S1S_1S1 是该位为 111 的数的集合。可以用字典树找到异或最大值最小是多少,然后依次尝试放入一个数,判断剩余序列是否存在合法解。并且,实际上我们只需要尝试三种方式即可:(1)...原创 2019-01-18 12:58:13 · 202 阅读 · 0 评论 -
【BZOJ1095】【ZJOI2007】Hide 捉迷藏
【题目链接】点击打开链接【思路要点】补档博客,无题解。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 100005struct info {int home, value; };bool operator < (info a, info b) { return a.home < b.home ...原创 2018-03-25 18:11:04 · 246 阅读 · 0 评论 -
【BZOJ3875】【JSOI2014】骑士游戏
【题目链接】点击打开链接【思路要点】考虑类似于用类似Dijkstra算法的贪心过程确定消灭每个怪兽的最小花费。用一个堆维护当前的最小花费集合,每次找出堆顶元素,确定为最终最小花费,并用这个值更新其它相关的最小花费。时间复杂度\(O(NLogN)\)。【代码】#include<bits/stdc++.h>using namespace std;const int MAXN = 200...原创 2018-04-21 13:48:54 · 321 阅读 · 0 评论 -
【BZOJ4520】【CQOI2016】K远点对
【题目链接】点击打开链接【思路要点】KDTree实现K-临近搜索,实现时需要用一个堆来辅助。时间复杂度\(O(N\sqrt{N}+NKLogK)\)。【代码】#include<bits/stdc++.h>using namespace std;#define MAXN 100005template <typename T> void read(T &x) {...原创 2018-04-25 17:17:33 · 214 阅读 · 0 评论 -
【CodeForces487E】【UOJ30】Tourists
【题目链接】CodeForcesUOJ【思路要点】首先我们来证明点双连通分量的一个性质。引理:在一个点双连通分量中,给定任意三个不同的点\(a\),\(b\),\(c\),一定存在一条从\(a\)到\(c\)的,经过每个点至多一次的简单路径经过了\(b\)。证明:考虑网络流。在原图中存在无向边的点对之间建立无向边,容量为1;对每个点拆点限流,容量为1;由\(a\)和\(c\)向汇点连边,容量为1;...原创 2018-05-20 11:00:27 · 322 阅读 · 0 评论 -
【BZOJ4198】【UOJ130】【NOI2015】荷马史诗
【题目链接】BZOJUOJ【思路要点】如果将一个合法的分配方案放到字典树上,那么每一个关键节点均为叶子结点。考虑如何使答案最小化,数据范围较大,考虑贪心。我们注意到一系列具有相同父亲的叶子结点可以被看作一个大小为它们大小总和的叶子结点。我们称之为一次合并,我们不断地执行合并,最后就会得到字典树上的根节点。由于我们希望使最小化答案,而一个叶子结点被合并的次数越多,其大小在答案中被计算的次数也越多,所...原创 2018-05-27 14:39:28 · 307 阅读 · 0 评论 -
【BZOJ4946】【UOJ318】【NOI2017】蔬菜
【题目链接】BZOJUOJ【思路要点】考虑只有一组询问。我们可以计算出某种蔬菜最后变质的时间\(f_i\),将这种蔬菜拆分成\(f_i\)或\(f_i+1\)份,前\(f_i-1\)份质量为\(x_i\),价格为\(a_i\),在第1、2……\(f_i-1\)天后就会腐烂;第\(f_i\)份质量为1,价格为\(a_i+s_i\),在第\(f_i\)天后就会腐烂;若还有剩余,剩余的分为一份,价格为\...原创 2018-06-01 16:05:21 · 558 阅读 · 0 评论 -
【CodeForces】CodeForces Round #403 (Div. 1) 题解
【比赛链接】 点击打开连接 【题解链接】 点击打开链接 **【A】**Andryusha and Colored Balloons【思路要点】 显然答案有下界:Max{di+1}Max{di+1}Max\{d_i+1\},其中didid_i为点iii的度数。 我们用构造的方式来说明这个下界是可以取到的。 将度数最大的点作为根...原创 2018-08-07 20:51:15 · 425 阅读 · 0 评论 -
【CodeForces】AIM Tech Round 5 (Div. 1 + Div. 2) 题解
【比赛链接】 点击打开连接 【题解链接】 点击打开链接 **【A】**Find Square 【思路要点】 答案即为所有黑色方格坐标的平均值。 时间复杂度O(N∗M)O(N∗M)O(N*M)。 【代码】 #include&lt;bits/stdc++.h&gt;using namespace std;c...原创 2018-08-29 15:40:09 · 400 阅读 · 0 评论 -
【BZOJ5418】【UOJ396】【NOI2018】屠龙勇士
【题目链接】 BZOJ UOJ 【思路要点】 用 exgcdexgcdexgcd 合并每一步的结果。 时间复杂度 O(NLogN)O(NLogN) O(NLogN) 。 【代码】 #include<bits/stdc++.h>using namespace std;const int MAXN = 1e5 + 5...原创 2018-09-11 14:32:33 · 271 阅读 · 0 评论 -
【AtCoder】AtCoder Grand Contest 037 题解
【比赛链接】点击打开链接【题解链接】点击打开链接【A】 Dividing a String【思路要点】设一个划分中第一次出现长度超过 222 的 SiS_iSi 的位置为 iii 。则可以通过将 SiS_iSi 划分为更小的串,以及将 SiS_iSi 的某一个后缀拼接至 Si+1S_{i+1}Si+1 的方式使得第一次出现长度超过 222 的 SiS_iS...原创 2019-08-19 11:14:41 · 855 阅读 · 0 评论