【数据结构】STL
文章平均质量分 70
mysterynoip
蒟蒻OIer
展开
-
bzoj 2028 [SHOI2009]会场预约 set
题面 题目传送门 解法 简单的STL应用 考虑一下前面的线段[l,r][l,r][l,r]会在什么时候与当前线段[l′,r′][l′,r′][l',r']冲突,显然,只要满足r′≥l,l′≤rr′≥l,l′≤rr'≥l,l'≤r的条件就可以说明这两条线段有交 所以,我们可以开一个set来维护前面的若干条线段,每一次加入一条线段的时候先找到右端点大于lll的线段,然后一个一个扫过去,能...原创 2018-08-23 09:48:00 · 173 阅读 · 0 评论 -
bzoj 1691 [Usaco2007 Dec]挑剔的美食家 贪心+multiset
题面 题目传送门 解法 显然,每一头牛肯定是尽量选取最接近自己的那一份 考虑将牛的需求和干草分别按照第二关键字排序 求解第iii头奶牛的时候先将所有第二关键字不小于它的干草加进一个multiset里面 然后找它价格的后继就可以了 时间复杂度:O(nlog n)O(nlog n)O(n\log\ n) 代码 #include <bits/stdc...原创 2018-08-16 19:19:03 · 178 阅读 · 0 评论 -
bzoj 2151 种树 贪心+堆
题面 题目传送门 解法 堆用来撤销之前操作的经典应用 显然可以选择dp,但是复杂度好像不太对,应该是O(nm)O(nm)O(nm)的 一个比较显然的贪心是,每一次选择最大的那一个,然后一直这样取下去 很明显, 这个贪心是错误的:19 20 19 1 按照上面的贪心策略,我们会先选择20,然后再选择1。显然,这个方案没有19+19优 所以,我们现在要考虑如何“撤销”之前错误的选择方案 ...原创 2018-08-24 14:16:29 · 216 阅读 · 0 评论 -
bzoj 1095 [ZJOI2007]Hide 捉迷藏 动态点分治+堆/线段树
题面 题目传送门 解法 数据结构题…… 讲一下两种不同的思路吧,用括号序列怎么做我不会 因为有修改并且有关于点之间距离的询问,所以我们考虑动态点分治 首先建出点分树,然后每一个点开两个堆。“第一个堆记录子树中所有节点到父亲节点的距离,第二个堆记录所有子节点的堆顶,那么一个节点的堆2中的最大和次大加起来就是子树中经过这个节点的最长链。然后我们最后开一个全局的堆,记录所有堆2中最大值和次...原创 2018-09-15 16:41:55 · 190 阅读 · 0 评论 -
bzoj 5418 [Noi2018]屠龙勇士 扩展中国剩余定理+multiset
题面 题目传送门 解法 可以说是excrt(扩展中国剩余定理)的板子题了 首先,我们需要求出每一次打怪用的是那一把剑,这个显然可以直接用multiset解决 然后我们就要解决这样一个问题,求解下列形式的nnn个同余方程: atk[i]x≡hp[i](modheal[i])atk[i]x\equiv hp[i]\pmod {heal[i]}atk[i]x≡hp[i](modheal[i]) 如何将...原创 2018-09-20 20:31:31 · 125 阅读 · 0 评论 -
bzoj 4777 [Usaco2017 Open]Switch Grass 线段树+multiset
题面 题目传送门 解法 因为我比较菜,离线的做法并不会…… 显然我们可以发现一个性质:不同颜色的最短距离一定是某一条边。 然后我们可以发现,这些答案边一定在最小生成树上,且任意一棵最小生成树都满足。 考虑这个为什么是正确的。假设存在一条不在最小生成树上的边(x,y,v)(x,y,v)(x,y,v)满足答案要求,那么同时也一定会与一条xxx到yyy且总长度不超过vvv的路径上存在某一条边满足条件,...原创 2018-11-06 22:13:01 · 176 阅读 · 0 评论 -
bzoj 2678 [Usaco2012 Open]Bookshelf dp+multiset
题面 题目传送门 解法 显然有一个O(n2)O(n^2)O(n2)的dp:f[i]=min(f[j]+max(h[j+1],…,h[i])) (s[i]−s[j]≤L)f[i] =min(f[j]+max(h[j+1],\dots,h[i]))\ (s[i]-s[j]\leq L)f[i]=min(f[j]+max(h[j+1],…,h[i])) (s[i]−s[j]≤L)。...原创 2018-11-07 16:06:46 · 193 阅读 · 0 评论 -
bzoj 1396 识别子串 & bzoj2865 字符串识别 后缀数组+线段树
题面 题目传送门 双倍经验传送门 解法 解法全靠yy…… 显然我们可以先构造出后缀数组。我们令len[i]=max(height[rnk[i]],height[rnk[i]+1])len[i]=max(height[rnk[i]],height[rnk[i]+1])len[i]=max(height[rnk[i]],height[rnk[i]+1]),表示从iii开始长度超过len[i]len[...原创 2018-11-21 21:25:37 · 300 阅读 · 0 评论