刷题记录

https://www.luogu.com.cn/record/290563103
一个比较简单的贪心。但是我的实现相当的堪忧。打算看看题解的实现方法后重新实现。
大家实现的都和我差不多。看来我也不屎。

https://www.luogu.com.cn/record/290545886
经典分治题目。
但是复杂度挺迷的。
不过也算是学了分治的大框架:(判断是否需要return),治,分,合

关于如何判断一道题目是分治:
1.问题可以分(原问题可以被拆分成若干结构相同,解法相同的子问题)
2.子问题相互独立(如果子问题之间需要共享信息或者相互依赖那么更有可能是动态规划或者递归搜索)
3.子问题的解可以“合”(各自问题的解可以合并成原问题的解)

更容易识别的:\(O(logn)\)时间复杂度或者\(O(nlogn)\)时间复杂度或者\(O(nlog^2n)\)时间复杂度
如果涉及到\(2^n\)相关可以第一时间往分治上想一想

https://www.luogu.com.cn/problem/P1228
一道分治。

关于如何去思考和构建分治。
这道题目初看时没什么思路。后面去看了题解的做法发现是可与从小的子问题去推出究竟是怎么“治”的。就拿这道题目来说吧,在有四个格子的时候,有一个公主站在一个位置上,此时我们可以使用一个积木块填补。当有44十六个格子的时候,有一个22的格子里面有一个公主,其他三个都没有。就可以在中间摆一个积木使得其他三个格子都有一个障碍,大概长这样
屏幕截图 2026-08-04 113643

从4*4的结局方案中我们可以发现,一个大正方形可以分成四个小的去分别解决。
那么分治的基本思路雏形就显现了。

最后就是实现。
实现一开始想可能会有些懵?
一般情况下我们需要做的就是先明确传入的参数再一步一步明确函数里面写什么。

把地毯写掉了。已经写了三道分治了,感觉是可以稍微总结一下。
这件事就交给ds吧!加油!强大的ds!

T1:分裂水晶
T2:平面上的最近点对
T3:地毯填补问题

image

image

迫于老师的压力开始练习一些容斥小题目labubu可爱捏。
https://www.luogu.com.cn/problem/P1450

初看很像是一个动态规划。
给人的感觉像是这个:
https://www.luogu.com.cn/problem/P28421

这道题目不是很难啊。
大概的思路就是先全部做一遍完全背包。然后使用容斥的思想将不符合条件的方案书减掉即可。
关于熔池如何简便地实现:使用二进制枚举的方法,就可以轻松地将所有的方案全部搞出来。

https://www.luogu.com.cn/problem/P9118
又是容斥啊喵。

这道题目是这样的:
如果\(k>=3\)那么事情会变得非常简单,我们可以直接遍历\(i=1;i*i*i<=n\)
然后在\(for\)循环里免去统计对于每一个\(i\)有多少个\(a\)能够使得\(i^a<=n\) && \(a>=k\)。

如果\(k==2\),我们使用容斥原理:\(ans=\)平方数的个数+高次幂数个数-既能是平方数又是高次幂的数的个数

比如说:\(64=2^6=4^3=8^2\)

那么我们就需要减掉多算的。

关于如何计算平方数的个数。此处我们有一个结论:\(f(n)\)表示\(\le n\)的平方数的个数
那么\(f(n)=floor(sqrt(n))\)

差不多就这样。实现不算非常难吧?

我操了!这里由于\(i*i*i<=n\)要开long long!不开不是WA是TLE!

https://www.luogu.com.cn/problem/P4447
一个贪心。

这道题好精妙啊。有一个单调队列的做法,用类似离散化的方式来标记队列的末尾数值,用末尾数值来对一个queue进行记录。

先排序。

对于每一个数,如果它还没有出现过,就新给它建一个队列(注意此处开一个1e5大小的小根堆单调队列数组),新来一个数字就新建一个数字,由于>1e9,使用map来做一个类似于离散化的操作。

如果它无法接上任何一个数,那么就在它的小根堆里塞一个1.如果它能够接上,就去它能够接上的队列的top(由于小根堆),然后把top pop掉,把这歌top的数值+1重新塞回这个队列里面。最后去每个队列的最小数值。

分组这道题目在考察一个什么样的贪心?
将一个数列用“必须连续且不重复”的条件约束来分割,并且询问最后分割出的板块的长度的最小值的最大值。

使用一个神奇的末尾贪心标记的优先队列进行维护每一个末尾数值,以排序为基础去做。

贪心思想体现在哪里?
贪心思想体现在,每次将当前的数字接在数列之后,都会选择数列长度最小的哪个数列,因此去考虑使用单调队列维护。

如何去想到本题的做法?

首先你能想到(没什么鸟用的)二分答案。
然后你就会被如何写check难住。

考虑出一个神奇的\(O(n^2+n\log{n})\)的暴力做法。
就是先对数列进行排序,然后开\(10^5\)个数组,对于每个\(i\),检查它能够塞进哪一个数组的末尾。

而这个思路可以根据一些神奇的推理转换成这样的思路:

用一个map去对每一个末尾数字进行一个离散化。以末尾数字离散化之后的结果为每一个优先队列的下标,开一个神奇的优先队列数组(注意这里可以想到百万deque过大江,但是不能乱开数组的是:deque,unordred_map,unordered_set),最后往优先队列里去塞数。

关于为何优先队列是小根堆?
当然是因为贪心。要找最小值啊。

https://www.luogu.com.cn/problem/P1080
感觉比较容易想到的是两个思路:
1.使得大臣按照右边手上的数字从小到大的从前往后排序
2.使得大臣按照左边手上的数字从小到大的从前往后排序

考虑是否可以再进行二分?

好吧好吧不乱想了。
这边我们需要用到一个比较常见的策略:邻项交换法

image

image

image
image
image
image
image

哦。好像推错了。
我把i写成j了。
不过没关系,这种东西是可以现场修改的。
image
最后能够证明得到不成立

所以可以得出结论:按照\(a[i]*b[i]\)从小到大排序就是最优的。
这道神秘题目还需要高精度乘法和除法。有问题。没有见过事这么多的题。

posted @ 2026-08-04 16:26  Baltic  阅读(7)  评论(0)    收藏  举报