堆
WerKeyTom_FTD
我是一只来自中山纪念中学高三的oier,请多多指教
展开
-
[bzoj4326][NOIP2015]运输计划
题目大意树上有许多条路径,现在你可以将一条边的权值设为0,令所有路径的最大值最小。最长路径瓶颈我们注意到,设为0的边如果不在最长路径上,就不会减小答案。 因此我们可以找出最长路径,把原树转化为一条链+许多树的模型。 预处理出每个点i的from[i]表示由链上哪个点延伸的。 接下来我们可以枚举将链上哪条边变为0,则经过这条边的最长路径一定是最长链,我们只需维护出不经过这条边的最长路径。这个显然可原创 2015-11-13 21:29:56 · 1284 阅读 · 0 评论 -
[arc080e]Young Maids
题目大意一个长度为偶数的排列p,每次取出相邻两个数并从p中删除,然后将这两个数按顺序加入q的开头(q初始为空)。 问能得到最小字典序的q。做法在堆中保存若干个区间(l,r),以及从中选出最小的和l奇偶性相同的位置u,以及在这个位置之后最小的和r奇偶性相同的位置v。记作(l,r,u,v)。 然后我们每次从堆中取出a[u]最小的(l,r,u,v),并将u、v加至开头,然后把区间分裂成(l,u-1)(原创 2017-11-03 08:30:46 · 828 阅读 · 0 评论 -
回转寿司
题目描述分块你考虑有一堆人,价格为x的进去了出来会变成啥样。 那么肯定是找到这堆人所持价格的最大值y,如果x>y,出来的还是y,否则x会变成某个人手里的,然后出来的是y。 我们考虑分块,每个块维护一个数堆。 如果x要经过一个块,可以丢进数堆,再取出一个最大值。然后还要给这个块打上一个标记。 但是对于零散的不是很好做,即重构块,我们如何快速得到每个位置经过一系列标记后的值? 注意这个问题具有原创 2017-06-25 20:44:18 · 651 阅读 · 0 评论 -
[LibreOJ β Round]ZQC的手办
题目大意区间对一个数取max。 区间求最小的x个比k小的数。线段树第一个操作很好搞。 第二个操作有个很显然的常数大做法。 实际上可以用堆把这个区间的笛卡尔树按优先级广搜。#include<cstdio>#include<algorithm>#include<queue>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;con原创 2017-06-19 21:08:11 · 744 阅读 · 0 评论 -
量化交易
题目大意对于一个序列,每个位置可以填左括号/右括号或不填。 必须使括号序列合法,同时价值为右括号处权值和-左括号处权值和贪心假如我们已经得到了前i-1的填写方案,bz[i]=1表示填了左括号,-1表示填了右括号,0表示没填。 我们用一个数据结构例如堆来保存前i-1里bz值为-1和0的。 现在我们考虑在i填右括号,我们找到堆中最小值j。 然后如果a[i]-j>=0则我们就配对,然后bz[i]–原创 2016-10-31 15:45:08 · 555 阅读 · 0 评论 -
图的半径
题目大意给定无向图,求图的半径。 图的半径定义:找到图上一点(可以在边上),使得其余所有点到该点最短路最大的那个最小,这个最小的最大最短路就是图的半径。该点称为中心。观察先做floyd跑双源最短路 我们枚举一条边j连向k,长度为t,认为中心在这条边上。 那么答案min(maxni=1(min(dis[j][i]+x,dis[k][i]+t−x))))min(max_{i=1}^n(min(di原创 2016-11-10 16:49:54 · 2820 阅读 · 0 评论 -
灵知的太阳信仰
题目大意每个位置有两个值ai和bi。 给一个序列分成若干连续段,使得每个段内a值互不相同,代价是b的最大值。求最小代价。DP我们思考设fi表示给1~i分段的最小代价。 我们可以处理出ci表示一个最小的k使得[k,i]没有重复a。 这个随便用个桶就实现了吧。。 那么Fi=mini−1j=ci−1(Fj+max(j+1,i))Fi=min_{j=ci-1}^{i-1}(Fj+max(j+1,i)原创 2016-11-10 16:25:44 · 908 阅读 · 0 评论 -
ksum
题目描述瞎搞经典题了#include<cstdio>#include<algorithm>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;typedef long long ll;const int maxn=100000+10;int left[maxn],right[maxn];ll heap[maxn],sum[max原创 2016-10-29 18:52:47 · 435 阅读 · 0 评论 -
排队
题目描述做法我们先处理出fix表示在全空情况下不断进人,i这个房间被第几个人最终停留。 用一个堆保留空房间当前fix的最小值,每次进一个人就是选择堆中最小值的房间。 拿走人的话观察一下就是从这个房间往上有人房间的数量-1,这个可以倍增来求,因为这个房间到根路径上有人和没人一定是分离开的。 分析一下势能这样做是n log n的。#include<cstdio>#include<algorith原创 2016-10-06 07:46:37 · 436 阅读 · 0 评论 -
成绩调研
题目大意求有多少个区间满足权值为i的数量在[li,ri]内。扫一扫我们枚举区间右端点,左端点的可取范围是一段区间。 尝试用两个堆维护左端点的最大值和最小值。 对于第i种权值,我们可以通过指针跳跳跳获得在位置i时左端点的左界和右界,所以一个堆保存所有权值的左界另一个保存右界。 注意l=0以及r=0的情况。#include<cstdio>#include<algorithm>#include<原创 2016-10-06 07:34:57 · 381 阅读 · 0 评论 -
[bzoj3252]攻略
题目描述众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏。 今天他得到了一款新游戏《XX半岛》,这款游戏有n个场景(scene),某些场景可以通过不同的选择支到达其他场景。所有场景和选择支构成树状结构:开始游戏时在根节点(共通线),叶子节点为结局。每个场景有一个价值,现在桂马开启攻略之神模式,同时攻略k次该游戏,问他观赏到的场景的价值和最大是多少(同一场景观看多次是不能重复原创 2016-09-19 22:13:27 · 740 阅读 · 0 评论 -
矩阵
题目大意求出一个n*m的矩阵中长至少为x宽至少为y的矩形价值的第K小。 每个元素都是非负整数,一个矩形的价值定义为所有元素和,相同价值的不同矩形在计算答案时算多个。经典套路观察一个以(x1,y1)为左上角的矩形。 假如右下角为(x2,y2),这个矩形一定比(x1,y1,x2+1,y2)和(x1,y1,x2,y2+1)都小。 所以先把所有位置为左上角的长为x宽为y的矩形扔进堆里。 每次取出一个原创 2016-09-04 07:33:09 · 468 阅读 · 0 评论 -
[NOIP2015]推销员
题目大意现有长度为N的两个数组a和s 有N个询问,第i个询问你需要找出一个i使得s[i]*2+a[i]+1..i-1中a数组前i-1大的值之和最大。整体二分注意到每个询问找出的那个最优的i是满足单调性的 因此可以对所有询问整体二分 用solve(l1,r1,l2,r2)表示当前处理第l1~r1个询问,他们最优的i范围在l2~r2。 令mid1=(l1+r1)/2,我们在l2~r2则找,看看那原创 2015-11-14 13:31:58 · 1858 阅读 · 2 评论 -
蓝雨
题目大意一个长度为nnn的序列,每个元素都是[1,n][1,n][1,n]。 一个区间代表的序列是将其元素排序。 现在求出区间代表序列字典序按高到低排名在区间[p,q][p,q][p,q]的区间。 q-p<=100000。做法我们如何快速比较两个区间代表序列的字典序? 主席树维护区间哈希即可。 那么只要我知道第p个,可以用经典做法推到第q个。 关键是第p个。 考虑逐...原创 2018-06-25 17:18:26 · 1088 阅读 · 0 评论