【Luogu】P1602Sramoc问题(堆)】的更多相关文章

[luogu]P1168 中位数 题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], …, A[2k - 1]的中位数.即前1,3,5,……个数的中位数. 输入输出格式 输入格式: 输入文件median.in的第1行为一个正整数N,表示了序列长度. 第2行包含N个非负整数A[i] (A[i] ≤ 10^9). 输出格式: 输出文件median.out包含(N + 1) / 2行,第i行为A[1], A[3], …, A[2…
显然答案是将一段区间全部转化成了其中位数这样的话,需要维护一个数据结构支持查询当前所有数中位数对顶堆 用两个堆将 < 中位数的数放入大根堆将 > 中位数的数放入小根堆这样就会存在删除操作 删除的时候由于无法快速删除只需做个标记,标记该数被删除了一次并且堆的实际大小也应该另外记录维护 在标记时需要更改相应的堆的大小与权值答案就非常显然了 #include <bits/stdc++.h> using namespace std; #define gc getchar() inline…
Luogu P4779 利用堆/优先队列快速取得权值最小的点. 在稠密图中的表现比SPFA要优秀. #include<iostream> #include<cstdio> #include<queue> using namespace std; struct data { long long next,to,val; }edge[500005]; long long cnt,head[500005],n,m,s,u,v,w,cost[500005]; bool vis[…
题目链接 很巧妙的想法.一开始将1~k-1加入堆中,然后每次从堆里取出一个最小的,判断是不是答案,如果不是,那么就枚举新数的末一位加上. 代码如下 #include<cstdio> #include<cstdlib> #include<cctype> #include<cstring> #include<algorithm> inline long long read(){ ,f=; char ch=getchar(); while(!isdig…
CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆) Description 有n个函数,分别为F1,F2,...,Fn.定义 \(Fi(x)=Aix^2+Bix+Ci(x∈N^∗)\).给定这些Ai.Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个). Input 第一行输入两个正整数n和m,n<=500000, m<=500000 以下n行每行三个正整数,其中第i行的三个数分别为Ai.Bi和Ci.输入数据保证Ai<=10,…
题目链接:https://www.luogu.org/problemnew/show/P3378 是堆的模板...我懒,STL da fa is good #include <iostream> #include <cstdio> #include <queue> #include <algorithm> using namespace std; priority_queue<int,vector<int>,greater<int&g…
其实这个题完全不需要用手写堆,只需要一遍遍sort就行了…… 但是! 为了练习手写堆,还是用手写堆做了. 在做本题之前,如果你没有什么思路的话,建议先做Luogu的合并果子. 好,假设你已经做过了合并果子了.那么正式开始本题: 相信许多人都已经知道了这道题就是合并果子,但是还不知道它是怎样转化成合并果子的,其实很简单:比如说9 7 6 5 3,有些同学可能会想:每次我砍最大的,然后剩下的不就少了.其实不然,因为不一定一次只能砍一个,可以砍两个或两个以上.不多说,我把上面例子的最优策略讲出来大概就…
Luogu P1168 Luogu P1801 UVA 501(洛谷Remote Judge) 前置知识:堆.优先队列STL的使用 对顶堆 是一种在线维护第\(k\)小的算法. 其实就是开两个堆,一个是大根堆,一个是小根堆.两个堆的根相对. 下面借助题目P1168进行详细分析. P1168 题意很好理解,不多作分析. 显然当\(i=1\)时,中位数就是\(a[1]\),记为\(mid\). 我们可以使用对顶堆,把比\(mid\)小的存入大根堆,比mid大的存入小根堆. 当我们已经加入奇数个元素时…
题目链接: https://www.luogu.org/problemnew/show/P1552 分析: 一开始愣是没看懂题,后面发现就是你要找一个树上点集使得各点权值之和小于\(M\),并且找一个点集的公共祖先\(Anc\)(管理者),使\(Anc\)的领导力乘以点集大小最大 一开始想DP,一看数据范围,我们可以稍微暴力一点,枚举每个点作为管理者的答案最大值,我们只要在子树中权值最小的点选起使权值之和小于\(M\)就可以了,一下问题简单了许多. 再暗中观察分析,发现这个信息是可以维护转移的,…
((^ 0.0 ^)    )~ 堆是一个完全二叉树,对于小根堆,所有父节点<=子节点,下标就和线段树是一样的 在STL里就是优先队列 只有堆顶元素可以操作(询问或弹出). 加入新元素时x,heap[++size] = x,下标t=size: 每次比较它和父节点(t/2)的大小,如果它较小就swap. 删除堆顶元素时,用最后一个元素heap[size--]覆盖heap[1],下标t=1: 每次比较它和左右两个儿子的大小,和较小的swap. 注意: 下标t的值不能大于堆的size: 我一开始是这么…