![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
蓝桥杯辅导课之前缀和与二分
凌窍
只有变强才能被尊重,才有选择的权利!
展开
-
k倍区间c++
实际上,这个双层循环可以理解为,在右端点r固定,l 在 0 ~ r - 1 之间变化的情况下,可以找到多少个满足 (s[r] - s[l]) % k == 0的区间,判断条件变换一下得:(s[r] % k - s[l] % k) % k == 0,即在 0 ~ r - 1 之间能找到有多少个s[l] % k 等于 s[r] % k,使得[l, r]构成k倍区间(这样处理的区间可以做到不重不漏,因为当余数相同的s[i]越来越多时,固定一个r,变化的是l)。原创 2024-03-03 19:29:23 · 295 阅读 · 0 评论 -
激光炸弹c++
一个是本题的下标是从0开始的,而二维前缀和模板从1开始,因此下标要变一下。另一个是炸弹爆炸的范围可能比地图区间大,为了更好计算一个爆炸范围内的总价值,可以把地图“扩大”,扩大的地图目标价值为0。最后一个是题目说的目标是在格点而不是格子内的,炸弹只能“摧毁一个包含R×R个位置的正方形内的所有目标”,边上的不可以。由题知本题要求某个区间内数的和,联想到二维前缀和。我们可以先使用二维前缀和模板计算各区间的价值。然后枚举以某点为右下角,大小为R*R的正方形价值,取最大值。原创 2024-03-03 00:09:41 · 223 阅读 · 0 评论 -
四平方和c++
第一个双重循环保存 s = c^2+d^2 所有可能的值,又因为题目要求输出 c 和 d ,因此也要保留 c 和 d。第二个双重循环枚举所有 a 和 b 的组合,对于每个 a 和 b,判断是否有一个 s,使得 s + a^2 + b^ 2 = n。首先想到的是使用三重循环求出 a,b,c,d 可以通过 n - a - b - c 得到。通过两个双重循环我们发现,(c,d)组合与(a, b)组合在个数、数值上都相同,a和b是从小到大枚举的,所以第一次找到四元组时,a和b一定是四元组中最小的两个数。原创 2024-03-02 15:55:14 · 420 阅读 · 0 评论 -
分巧克力c++
观察数据范围,时间复杂度要限制在O(n logn)以内,同时观察到“每位小朋友至少能获得一块1×1的巧克力”,说明只要巧克力边长缩小到一定长度,一定有解。这个很容易证明:假设要切边长为s的小块巧克力,那么一块。因此本题可以利用这个性质来使用二分来做。边长的可能范围为1~100000。对于每个可能符合条件的边长,使用这个边长来分割N块巧克力,看分割出来的巧克力块数是否大于等于K。随着s减小,那么可以切的总块数会增加。原创 2024-02-29 19:09:40 · 539 阅读 · 0 评论 -
机器人跳跃问题c++
观察数据范围,时间复杂度要控制在O(nlogn)之间,观察到样例输出均不超过最高建筑物高度,结合题目所说的“如果H(k+1)原创 2024-02-28 19:38:46 · 188 阅读 · 0 评论