堆
csu_xiji
这个作者很懒,什么都没留下…
展开
-
力扣 528. 按权重随机选择 二分/堆
https://leetcode-cn.com/problems/random-pick-with-weight/思路一:随机+二分。首先独立计算出每个数被选中的概率,然后计算该数组的前缀和。那么aia_iai被选中的概率就等于sumi−sumi−1sum_i-sum_{i-1}sumi−sumi−1,且sum[0..n)=1sum[0..n)=1sum[0..n)=1。因此每次pickpickpick可以先计算一个[0,1][0,1][0,1]内的随机数,然后看它落到哪个元素的区间范围内,利用二原创 2021-09-02 00:54:34 · 128 阅读 · 0 评论 -
洛谷 P3371 P4779 单源最短路径 堆优化
https://www.luogu.org/problemnew/show/P3371https://www.luogu.org/problemnew/show/P4779这两道题都是有向图,改成无向图也很简单,读入边的时候当做无向边处理就好了。没有测试朴素版的迪杰斯特拉,看数据范围O(n^2)应该是会超时的吧。给出代码:#include<iostream>#inc...原创 2019-01-29 22:20:14 · 184 阅读 · 0 评论 -
洛谷 P3377 【模板】左偏树(可并堆) 左偏树
https://www.luogu.com.cn/problem/P3377题目描述如题,一开始有N个小根堆,每个堆包含且仅包含一个数。接下来需要支持两种操作:操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或第y个数已经被删除或第x和第y个数在用一个堆内,则无视此操作)操作2: 2 x 输出第x个数所在的堆最小数,并将其删除(若第x个数已经被删除,则输出-1并无视删除操...转载 2020-01-10 13:43:51 · 191 阅读 · 0 评论 -
堆排序&快速排序+优化 随机选取基准值+插入排序优化+相同元素聚集优化
写在前面虽然很早就知道快排的思想了,但是并没有自己写过。其实写过最朴素的版本的,于是非常轻易的被卡成了O(n2)O(n^2)O(n2)的复杂度233333233333233333。最近心血来潮决定写一发优化的快排。基准值优化基准值的选取对时间复杂度的影响还蛮大的,固定选择某一个位置的值作为基准值的快排在处理有序、重复等数组时可能会达到O(n2)O(n^2)O(n2)的复杂度。关于这一项的优化...原创 2020-03-21 14:52:35 · 643 阅读 · 0 评论 -
力扣 703. 数据流中的第 K 大元素 堆 思维
https://leetcode-cn.com/problems/kth-largest-element-in-a-stream/思路:用treaptreaptreap之类的数据结构肯定可以搞定,不过这道题目只有插入操作,没有删除操作,且kkk是固定的,那么直接用堆就可以了。维护一个元素个数恰好为kkk的小根堆,那么堆顶元素就是第kkk大元素。class KthLargest {public: priority_queue<int,vector<int>,greater&l原创 2021-02-11 14:41:34 · 167 阅读 · 0 评论 -
PIPIOJ 1466: PIPI捡垃圾Ⅱ 堆 思维
http://pipioj.online/problem.php?id=1466思路:利用堆可快速求出中位数(当然诸如TreapTreapTreap之类的数据结构也是可以的),思路就是用大根堆维护最小的(n+1)/2(n+1)/2(n+1)/2个元素,用小根堆维护最大的n/2n/2n/2个元素,那么中位数要么等于大根堆堆顶要么等于两个堆顶之和再除222。#include<bits/stdc++.h>#define INF 0x3f3f3f3fusing namespace std;原创 2021-03-04 01:00:43 · 157 阅读 · 2 评论 -
力扣 692. 前K个高频单词 堆+哈希
https://leetcode-cn.com/problems/top-k-frequent-words/思路:先用哈希统计每个单词的出现次数,然后就是经典问题:求前kkk个最大/小元素。堆或者快排分割都行。class Solution {public: vector<string> topKFrequent(vector<string>& words, int k) { unordered_map<string,int> cnt原创 2021-05-20 20:01:02 · 128 阅读 · 0 评论 -
力扣 218. 天际线问题 堆 扫描线
https://leetcode-cn.com/problems/the-skyline-problem/思路:首先意识到每个建筑物的左右端点都有可能成为我们所关注的轮廓点,按照天际线的输出方式,我们应该读入这些端点并按照从小到大的顺序排序。然后考虑在每一个端点pxp_xpx的输出,实际上就是计算直线x=pxx=p_xx=px与建筑物相交点的yyy坐标的最大值,如果没有输出0即可。交点y坐标不就是建筑物的高度嘛,O(n)O(n)O(n)遍历求最大高度肯定是不可取的(会超时),用堆维护即可。stru原创 2021-07-17 12:52:09 · 189 阅读 · 0 评论