![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
巧妙的数据结构
陈末iiiiiiiiiiii
Retired
展开
-
Educational Codeforces Round 32 G. Xor-MST 启发式合并字典树、Boruvka求最小生成树 + 最小异或字典树、分治
来与完整的作差,因为完整的肯定包含所有情况(有点可持续化的最终版本减之前的版本的感觉),利用差值判断其他连通块是否含有这个点。而字典树本身是能和连通块一样进行合并的,每颗字典树就相当于点,利用并查集找出他归属的树根节点,并查集本身又能记录每个连通块的。这里利用之前可持续化的一种思想,我们可以另外建一个完整的字典树(既有全部元素)。这样我们每次需要求出这个连通块和除了他本身处在的连通块中的元素能异或到的最小值,以及下标,并且把他们合并了。要求求出利用数组构成的生成树的最小的权值和。官方题解中给出了利用。...原创 2022-08-17 16:33:44 · 519 阅读 · 1 评论 -
2019银川区域赛 K题 Largest Common Submatrix 子矩阵(单调栈,悬线法两种解法)
给你两个矩阵矩阵内的数字为N*M的排列。找出两矩阵的子矩阵能相等的最大大小。N,M原创 2022-07-03 17:47:01 · 254 阅读 · 2 评论 -
AcWing 4487. 最长连续子序列 单调栈上二分 数组模拟栈的好处
首先讲公式化简为sum[r] - 100r > sum[l] - 100lsum为前缀和。这一步是很容易想到的,这样就只有一个变量了。然后就是怎么通过枚举一个i来确定前面的数小于自己且最远的数是什么。想了很久没想出来,y总这里使用了单调栈上二分来处理,之前没有见到过这种操作。先使用一个降序的单调栈来保证单调栈上的每个数都是最远的(手模理解)。如果这个数比栈顶还小,那肯定取不到答案,我们将它入栈。(如果一个数能取到答案,我们肯定不入队,因为在它前面肯定有更小的数)如果比栈顶大,说明存在答案。原创 2022-06-26 17:45:34 · 280 阅读 · 0 评论 -
Educational Codeforces Round 126 (Rated for Div. 2) D 线段树维护差分数组
题目给你一个数组A,每次可以指定一个大小为K区间L,R。使得从L到R的每个数分别减1,2,3,4,5…k。问至少需要多少次才能让数组的全部数变成非正数。题解思路参考pzr佬参考ygg佬可以直接贪心的正向考虑,从a1开始这个数肯定要变成非正数,所以我们直接使用a1次将它改变,每次只减1所以得k次。但是k个区间里的数都要减去对应的数,我们可以都减去1来求前缀(因为上面那个很明显是个公差为1的等差)。我们还得消除这个前缀给之后的点带来的影响,所以得在R+1加上K来抵消影响。要使用区间加减法可以用原创 2022-04-11 17:12:53 · 888 阅读 · 0 评论 -
Codeforces Round #623 (Div. 2) D 优先队列 并查集 数据结构 思维
题目VK 新闻推荐系统每天为每个用户选择 n 个不相交类别之一的有趣出版物。每个出版物都属于一个类别。对于每个类别,我批处理算法选择 ai 出版物。最新的 A/B 测试表明,如果每个类别在每日推荐中的出版物数量不同,则用户阅读推荐出版物的积极性更高。目标算法可以在 ti 秒内找到第 i 个类别的单个有趣出版物。将出版物添加到批处理算法执行结果所需的最短总时间是多少,因此所有类别都有不同的出版物数量?您无法删除批处理算法推荐的出版物。输入输入的第一行由单个整数 n 组成——新闻类别的数量(1≤n≤2原创 2022-03-16 19:09:47 · 1609 阅读 · 0 评论 -
Codeforces Round #769 (Div. 2) D 区间gcd st表 二分 贪心
题目长度从1到n的每个区间都需要求最小的操作数。题解思路首先区间gcd(l,r)定住一边的话是具有单调性的。定住l增大r,因为出来的gcd肯定是不增的,也就是降序。其次,利用st表,可以O1得出某段区间的gcd。之前的st表题目为什么可以用呢?因为只要我们的gcd能正确包括整个范围,不论有些地方重复覆盖了,也一样可以得出正确的gcd。这和最最大值是一个道理。因为答案固定了1到n的区间,所以我们定住右端点r。往有可能的地方进行二分搜索出有可能等于区间大小的部分。如果等于区间大小那么我们可原创 2022-02-24 20:34:56 · 115 阅读 · 0 评论 -
Codeforces Round #759 (Div. 2) D 结论 求逆序数的个数
题目给你一个长度为N 的数组 ai给定一种操作你可以选择3个下标 i j k使得ai aj ak 的相对顺序改变成 ak ai aj求能否通过这个操作使得原数组呈升序。题解思路当 i j k 都不同的时候,这个操作可以减少偶数倍的逆序数。当存在两个相同的数的时候,就有点神奇了,他可以让其中那个不同的数任意走到其中某个位置,这样就可以不断选择这两个数,使得另一个数归位。总结当存在两个相同的数的时候,一定可以,当都不同的时候,必须满足逆序数为偶数倍才能操作出来。求逆序数的原创 2021-12-13 14:36:38 · 479 阅读 · 0 评论 -
AtCoder Beginner Contest 231 F 离散化 树状数组
题目有N个种礼物,你必须选择两个礼物(可以是相同的种类)分别送给两个人。A和B都对礼物每个礼物有期望值ai bi。他们都不希望对方的礼物的期望值大于送到自己的礼物(期望值是相对自己而言)。问在N平方种方法中有几种分配方法能让满足他们的要求。题解思路正向反向考虑应该都行。我这里用的是正向考虑。我们将礼物的期望值带编号排序,这样我们往前遍历的过程中,之前的点就可以满足一个人的要求了,这样问题就变成了,前N个物品,找出有几个大于等于bi的。可以想到利用树状数组的存编号来继续快速前缀和判断(类似求原创 2021-12-12 19:05:28 · 287 阅读 · 0 评论 -
AtCoder Beginner Contest 228 D 并查集 并查集的抽象维护点之间的关系
题目题解思路参考大佬的博客如果不想重复+1寻找-1的操作,就必然让这个数能在log级别查询出下一个-1的位置。可以想到用并查集来记忆化维护这个情况,我们用并查集实现出节点之间指向最近的-1。当这个-1被写入时,我们将它和下个节点合并。当不是-1时,我们让它的根节点写入值,并将根节点和根节点下一个点合并。这样使得每个点不会被重复访问。这里被取模WA了,注意下就行了。AC代码#include <bits/stdc++.h>//#include <unordered_ma原创 2021-12-01 18:51:40 · 896 阅读 · 0 评论 -
2021牛客寒假算法基础集训营4 D 二分枚举答案 双指针维护区间
题目题解思路因为亲密度是第一键值,所以所有亲密关系,可以根据亲密度的情况来分类,并且每个亲密度下的关系有序(编号从小到大)。即存在一个亲密度,它的亲密关系 + 之前更小的亲密度的关系 刚好 大于等于 K。这里就有点分界点的意思了,所以我们尝试二分亲密度,看看能不能在On级别处理出这个亲密度以及一下的所有关系总数。枚举出P为此时的亲密度。这里双指针也太顶了,我们可以先处理出两个指针之间大小为P的区间的数的情况,即用哈希表统计每个数的情况。再用一个cnt来记录这个区间内和首指针不同的数的个数。首原创 2021-11-30 20:14:28 · 391 阅读 · 0 评论 -
Codeforces Round #756 (Div. 3) F 类滑动窗口的双指针 模拟 尺取法
题目有N个人在AMT机前,ATM机内有S元,每个人会存Ai元或者取-Ai元,取决于Ai的正负号。当ATM机钱不够下个人的时候就会关闭。请你选择一个连续的区间,使得ATM机能服务最多的人。题解思路很明显,找一个最长的连续区间使得区间和 sum + S >= 0 。利用双指针来维护区间,时间复杂度是On的。将每个头指针都延展到能延展的最大长度即可。记尾指针。更新答案,并且将这个头指针往前,并将头指针值弹出。再用记忆了的尾指针继续往后探。这样每个点最多被访问2次。上次写过类似的,这次原创 2021-11-27 11:46:44 · 612 阅读 · 0 评论 -
2021牛客寒假算法基础集训营3 E 线段树 查询区间中是否有相同的数 处理链表结构 预处理
题目题解思路预处理出每个相同数之前的点和后继节点。类似链表的结构。如果我们将首节点的前节点设置为0后继节点设置为n+1来保证数据合法性。将每个节点的后继节点导入线段树,再让线段树处理区间最小值。这样我们就可以完成查询操作了。根据查询出来的值是否合法即可。删除操作就类似链表删除某个节点。将合法的前节点直接指向后继节点。并且在线段树上修改即可。这里用链表处理属实巧妙AC代码#include <bits/stdc++.h>#define PII pair<int,原创 2021-11-23 19:22:02 · 361 阅读 · 0 评论 -
华东交通大学2021年ACM“双基”程序设计竞赛 I 括号 栈+模拟
题目题解思路连续的两个数字组成的每对合法的括号对(())的贡献等于 合法匹配对的个数 + 和之前的连续合法对的组合(即加上之前的数量)(())() 第2对个的贡献是 1 + 1()()() 第3对个的贡献是 1 + 2()(()) 第2个对的贡献是 2 + 1还有一些不等的对的情况()((())())((())这种不匹配的时候要将它之后的连续贡献取成1,但是在它和之后多的右括号合并之后又有可能连上之前的连续括号对,然后连续贡献又边大了。所以这里用到了两个栈。一个栈存多的右括号另原创 2021-11-20 10:31:09 · 328 阅读 · 0 评论 -
华东交通大学2021年ACM“双基”程序设计竞赛 F 线段树 二分出合法区间
题目题解思路看的出是线段树,一开始想用线段树的操作来模拟操作一,但是好像弄不出。这里就有个性质了,当你要修改某段为1的时候你查询它的总和不为它的长度时,只需将总和改成长度然后pd一下就行了。但是这个从哪里开始哪里结束要怎么返回呢?利用前缀和的单调性就能得到这段有几个被填上了的。所以我们可以进行二分,二分出那个没被填上的第一个点,以及二分出填的时候结束的位置(这里利用上面的性质,我们只需知道两个端点将他们的sum改成长度然后pd即可)这里的二分属实巧妙啊 int ans原创 2021-11-19 17:38:31 · 911 阅读 · 0 评论 -
2021牛客寒假算法基础集训营2双端队列的运用+模拟
题目题解思路性质(突破点):由于翻转一次后只能翻转左端点之后的点,所以这个翻转的左端点必然要让它等于i,如果这样不能相等那么之后一定翻转不到它。这样就形不成这个序列了。那么如果模拟这个过程呢?直接数组reverse?那肯定超时的。大佬们提供了一种思路利用双端队列来两头判断数。当这段区间翻转后从后头加数,前头先将翻转区间导入。当相等就将前头的数pop不等的时候肯定是需要翻转或者操作不到了。再翻转后就前头加数,后头先将翻转区间导入。以此类推。表示好这两种状态即可。当数加完的时候,要判原创 2021-11-15 20:39:17 · 242 阅读 · 0 评论 -
4075. 染色 并查集的运用 并查集运用的小细节
题目题解思路这题思路还是比较明显的,将颜色需要相同的气球全部并查起来,在搜索集合中颜色最多的颜色,将其他的也染成这个。这样贪心就能保证使用的染色最少。时间复杂度为On,看起来这样复杂很高,实际上每个点之会属于一个集合,所以每个点只走了一次。两端代码的不同让我找了好久的bug。 if ( a[i] == i ) { vector <int> pk ; vis[i] = cnt ; p原创 2021-11-15 14:41:34 · 403 阅读 · 0 评论 -
力扣677. 键值映射 DFS字典树 遍历unordered_map哈希表
题目题解思路字典树板子都不太熟悉复习一下这种数据结果,有点链表的感觉,带着一个指针指向后继的节点。直接用字典树板子,计算总和的时候,在这个节点的后面节点全dfs一遍即可。还可以遍历<unordered_map>来求解答案。这个操作我第一次看到,记录一下。AC代码字典树做法class MapSum {public: int son[5101][50] ; int cnt[5101] ; int index = 0 ; MapSum() {原创 2021-11-14 20:25:20 · 446 阅读 · 0 评论 -
2021牛客寒假算法基础集训营1 D 并查集 逆元 组合数学 二维网格转一维注意事项
题目题解思路首先探讨二维转一维的思路。将每个点转成横坐标乘N+纵坐标。看起来可以实现,但是这题需要四周的点,这样3 4 就被隐式连接了。所以会Wa。当我们先将N自增1的时候,每个能用上的XY就不会出现上面那种隐式连接了。(小技巧)然后回到这题,当一个1变成0的时候,四周的1也会变成0,即连锁反应。所以我们可以将每个有这种关系的点连通成块。想将所有1变成0必然是按每个连通块中的一个就行。假设有N个连通块,每个连通块有a1 a2…an个点。这样选择的情况就是N!a1a2*a3…*an原创 2021-11-11 09:44:54 · 301 阅读 · 0 评论 -
AtCoder Beginner Contest 225 D 模拟链表
题目给你N个辆车 和Q次询问。询问有3种1:将a车放在b车后面,保证b车后面没车且a车前没车,保证两车相邻。2:将a车从b车断开。保证两车相邻3:查询a车所在的列有多少车,并且从后往前输出。最多打印1e6的车次。题解思路链表题写少了,一开始没感觉出来,一直想着并查集,实际上只需维护一个点的前指针和后指针即可。直接模拟链表是On级别的。所以能过的很快。AC代码#include <bits/stdc++.h>//#include <unordered_map>原创 2021-11-02 21:42:17 · 167 阅读 · 0 评论 -
牛客xb月赛39 G 区间询问优化小技巧 欧拉筛 求区间最小质因子 树状数组求区间总数
题目题解思路1—n 有多少数可以表示为大于等于 K 的质数的乘积也就是 求1-n 有多少个数,这个数的最小质因子大于等于K。欧拉筛就是用数的最小质因子筛这个数为合数的,这样我们可以利用欧拉筛来筛出区间的每个数的最小质因子。这样我们将1-n的每一个数的最小质因子当成树状数组的指针。每多一个就将这个指针下的值++。利用树状数组logn求前缀和的特性,求出比指针K大的区间总和数。但是每次询问的区间大小不同。如果我们每次都清空再加入数,肯定会浪费很多时间复杂度。可以得到一个性质区间变大会影响小区原创 2021-10-26 19:21:06 · 177 阅读 · 0 评论 -
3662. 最大上升子序列和 树状数组 + 离散化 维护区间最大值
题目题解思路把最长公共子序列的模型优化成nlogn。可以使用树状数组优化,即每个编号点存对应的排序数(排序后应该在第几位)。(以便更新的时候直接更新前缀最大值)如果要用树状数组这样表示的话(直接查找一段区间的类似逆序情况,在不断更新的情况下保证了连续性。),就必须存这个数的真实值,但真正值过大,所以我们可以进行离散化。树状数组存以这个数为结尾的上升子序列和的最大值。参考文章AC代码#include <iostream>#include <cstdio>#incl原创 2021-10-21 17:06:56 · 121 阅读 · 0 评论 -
246. 区间最大公约数 更相减损术 差分数组 线段树
题目题解思路利用更相减损术(如图所示),我们可以让线段树存入原数组差分数组,这样区间的加法就变成了单点的加法,而且两边的gcd只需对一个位置的sum gcd一下,其他的都是可以传递的 。这样的话,这题的其他操作就有点类似245. 你能回答这些问题吗了参考文章AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vec原创 2021-10-02 10:15:34 · 69 阅读 · 0 评论 -
245. 你能回答这些问题吗 线段树 求某区间最大连续子段和
题目题解思路最大连续字段和 (tmax) 可以由某个节点的tmax推到,也可能是两端区间合并而成 这样我们就需要 lmax 和 rmax 求出左边节点的最大后缀和 和右边节点的最大前缀和。而推出lmax 又需要分两种情况 ,lmax 可能由 左边节点的 lmax直接得到 也可能由左节点的sum加上右节点的lmax得到。rmax则同理。这样的话我们要在线段树里放 l r sum lmax rmax tmax在建树和修改值的时候要使用上面的转移方程更新对应的值。但是查询仅仅只需求max 的 t原创 2021-10-01 17:16:08 · 116 阅读 · 0 评论 -
1275. 最大数 动态增加删除数 线段树 模板题 4倍空间
题目题解思路这题值动态的更新查询树 , 后面添加的值和之前更新的值有关系。不能用静态的方法做。这里把线段树模板的sum改成最大值即可。一开始初始化的时候要开到够大之前用线段树只开两倍空间 , 这次被搞了, 一直段错误 , 根据y总的估计 起码要4倍空间才能不段错误。AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <原创 2021-10-01 14:29:34 · 86 阅读 · 0 评论 -
244. 谜一样的牛 树状数组 根据正序数 逆向求出原排序
题目题解思路先将排列数的计数 插入树状数组 , 从最后一个数开始往前推 , 最后一个数在树状数组里的前缀和 (这里就是正序数 + 1 ) 必然等于 他的正序数 + 1(加上自己)。我们可以利用二分来搜出这个数 。当这个数被求出后,我们在树状数组里删除他(因为我们是从后面往前推的,所以我们不能让后面的数对前面的数求正序数造成影响 )。时间复杂度 O n log n log nAC代码#include <iostream>#include <cstdio>#inclu原创 2021-10-01 11:31:47 · 57 阅读 · 0 评论 -
243. 一个简单的整数问题2 树状数组同时实现区间加和求和 差分数组
题目题解思路这题也可以用线段树的懒标记做。这里用的是进阶版树状数组上一题,我们是直接存原数组的差分数组的树状数组来解决区间加法的问题,这一次我们再开一个ia[i]的差分数组的树状数组。按照上面推导的公式就能求出原数组的前缀和了。 add1( tre1 , t2 , t4 ); add1( tre1 , t3 + 1 , -t4 ); add1( tre2 , t2 , t2*t4 ); add1(原创 2021-10-01 09:40:17 · 94 阅读 · 0 评论 -
242. 一个简单的整数问题 树状数组 实现 区间加法 差分 前缀和
题目题解思路我们把原数组保存,把树状数组看成原数组要加的数的差分数组 , 对要加减的区间只需在首部加上目标值,在尾部的后一位减去目标值。由差分可以知道,对差分数组求前缀和就是原数组的值。而快速求前缀和正好是树状数组的性质之一。求这部分的前缀和,就可以得出要加多少数,然后加上原数就行了。AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#in原创 2021-09-30 20:04:32 · 80 阅读 · 0 评论 -
Codeforces Round #744 (Div. 3) E2 树状数组求正反逆序数 离散化的哈希冲突
题目事实上,问题 E1 和 E2 没有太多共同点。您可能应该将它们视为两个独立的问题。给定一个整数数组 a[1…n]=[a1,a2,…,an]。让我们考虑一个空的双端队列(双端队列)。 deque 是一种数据结构,支持在开头和结尾添加元素。因此,如果双端队列中当前有元素 [3,4,4],则在开头添加元素 1 将生成序列 [1,3,4,4],将相同元素添加到末尾将生成 [ 3,4,4,1]。数组的元素依次添加到最初为空的双端队列中,从 a1 开始,以 an 结束。在将每个元素添加到双端队列之前,您可以原创 2021-09-30 18:55:47 · 102 阅读 · 0 评论 -
241. 楼兰图腾 树状数组 求正反逆序数
题目题解思路这一步想了一个小时才想明白 。因为数组只包含了N的排序数。所以我们可以这样操作。从左到右将 数组的数 Y 标记(即自增1)进树状数组。利用树状数组logn求前缀和的特性来判断 大于Y的数有几个 小于Y的数有几个。(其实这些数都在 Y 的左边 )同理求出右边的数相乘就是正反逆序数 。 for (int i = 1 ; i <= n ; i++ ) { int y = a[i]; gr[i] = sum(n) - su原创 2021-09-28 21:23:47 · 99 阅读 · 0 评论 -
238. 银河英雄传说 带权并查集 + 懒标记
题目题解思路这里用到了类似懒标记的东西,用来解决查询固定之前那一列的元素的个数。如果我们不加以这个标记,只用w来记录这个节点到根节点的距离,如果他不之间给你一列的最后一个元素,这样普通的情况就出问题了。所以我们施加的懒标记来解决无法直接得到一列的元素个数。再接入新一列的时候,直接让原来根节点的w变成新一列的懒标记。而新一列的懒标记就可以加上并入那一列的标记了。这样find的时候值自然就被更新了。而且find完了是直接连接根节点的。不用担心+=带来的自增影响。太巧妙了。AC代码#in原创 2021-09-28 17:25:06 · 89 阅读 · 0 评论 -
239. 奇偶游戏 带权并查集 种类(扩展域)并查集 两种解法
题目题解思路复习了下 (几个月没碰又忘了)带权并查集是用来判断某些东西的一种相互关系。边权代表与根节点的权值进而判断与其他节点的关系。带权并查集一般都需要进行区间的处理 变成 左开右闭 ()权值转移 w[fx] = ( book + w[y] - w[x] + 2 ) % 2 ; a[fx] = fy ;判定的话只需要用小的减大的即可。种类(扩展域)并查集将偶数关系视为同类和就之前帮派那题差不多了。AC代码#include &l原创 2021-09-28 15:34:54 · 82 阅读 · 0 评论 -
237. 程序自动分析 并查集 + 离散化
题目题解思路数据范围太大 开不了那么大的数组(最大1e8) 所以我们进行离散化使用<unordered_map>进行离散实现 O(1)的查找(推荐map是logn级别的查找)可以先对相等的进行合并再对不相等的进行判断因为定义相等是不会影响后面不相等的情况的 。因为如果相等不对 我们假定他正确 不相等肯定不对 依然可以推出答案 不影响最后的答案而且这题要开两倍空间 (WA了2次)两个数可能全部都不一样AC代码#include <iostream>#inclu原创 2021-09-27 19:50:33 · 74 阅读 · 0 评论 -
1252. 搭配购买 并查集 + 01背包
题目题解思路利用并查集将搭配合并起来 。将每个连通块 进行 01 背包操作 这样复杂度最大 m*w 再对01背包进行一维优化 即可。AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <algorithm>#include <map>#include原创 2021-09-27 17:49:42 · 81 阅读 · 0 评论 -
1273. 天才的记忆 RMQ ST表 线段树
题目题解思路ST表改一下sum就成了经典 只有查询的线段树AC代码#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <vector>#include <algorithm>#include <map>#include <string>using namespace std;原创 2021-09-26 21:32:37 · 111 阅读 · 0 评论 -
106. 动态中位数 对顶堆 大根堆和小根堆 优先队列
题目题解思路 priority_queue <int> q1; //默认 大顶堆 priority_queue <int,vector<int>,greater<int> > q2 ; //小顶堆 只需要让小顶堆的所有元素都大于等于大顶堆 并且 大顶堆的元素不超过 小顶堆加1 因为我们在小顶堆顶取到中位数 。每次照着加入元素 后面再对元素的归属做调整即可。这题卡输出属实恶心。AC代码#include &原创 2021-09-26 17:06:06 · 93 阅读 · 0 评论 -
154. 滑动窗口 单调队列的经典应用 数据结构
题目题解思路当队满时(达到滑动窗口最大值)队头++让队头出队插入元素时不断循环当大于等于队尾时,此时队尾肯定不是之后最大元素了,出队。(等于也出队 ,后面的元素肯定比前面的更有潜力)当小于或者队空时入队。这样的操作,保证了每次窗口都是最大值。参考视频上面只讲了求最大值,求最小值就是把入队的符号更改即可AC代码#include <iostream>#include <cstdio>#include <cstring>#include <q原创 2021-09-18 16:09:18 · 63 阅读 · 0 评论 -
CodeForces - 1095E 括号匹配 栈的运用
题目题解思路各种前缀后缀中缀表达式都可以由栈来解决。每个括号需要找到他对应的括号。我们将左括号压栈,当遇到右括号时出栈。将括号的编号压栈!此时我们遵循括号就近匹配,利用先进后出来推出的。(这个特性有助于推出答案)当遇到无法处理(栈中没有元素来匹配)的括号时前压栈,由于我们只能进行一次操作,所以最后栈中只能存在2个无法匹配的元素。由于每种情况不同,我们进行分类特判处理。))左括号无法匹配,此时我们现在左括号前的任意与左括号相同的元素来替换,因为左括号右边的元素已经被匹配。(参考前面的特性)原创 2021-07-27 14:06:41 · 155 阅读 · 0 评论 -
Codeforces1498 新生选拔赛G题 贪心和堆 神奇的优先队列
题目链接题解思路首先想到的是从大到小或者从小到大 进行贪心,然后用W不断减去加进去的。当减不了使就增加宽度。这样就导致了有些位置明明能放小的没放 例如样例 8 8 8 2 2 2 这样算的花答案是4 但是答案是3 这样我们就需要用堆来维护这个存储的过程了,定义一个从大到小出队的优先队列,每次将最大的空间拿出来放置这个物体,这样等到小物体出现时空间就不会被浪费了AC代码#include<bits/stdc++.h>using namespace std;const int maxm原创 2021-04-27 15:35:04 · 81 阅读 · 0 评论