思路讲解
参考题解
https://www.luogu.com.cn/article/1o6edp6y
zkw线段树写法
1 | // 参考了(抄了)beta99999 的提交 https://www.luogu.com.cn/record/216441078 |
AC代码
AC
https://www.luogu.com.cn/record/199579498
1 |
|
参考题解
https://www.luogu.com.cn/article/1o6edp6y
zkw线段树写法
1 | // 参考了(抄了)beta99999 的提交 https://www.luogu.com.cn/record/216441078 |
AC
https://www.luogu.com.cn/record/199579498
1 | #include <bits/stdc++.h> |
来学习一下ST表(sparse table 稀疏表)
算了,我发现树状数组也不是不行,哈哈,我还是用我熟悉的树状数组
https://www.cnblogs.com/qdscwyy/p/9759220.html
我们来解释一些代码吧
1 | // 1个大区间想要遍历下面的小区间需要这么写 |
为什么需要这么写?
8二进制100维护区间8−lowbit(8)~8
lowbit(8)=23=2二进制中第一个1在第几位
AC
https://www.luogu.com.cn/record/199551454
1 | #include <iostream> |
树状数组+二分
你可以理解为用树状数组的区间加减加速模拟法(模拟法最大的瓶颈不就是区间加减吗?)

然后分数是只增不减的,初始分数比别人低,经过N次比赛后也不会比别人高
所以我们就能够用二分法找到区间的L,和R
1 | inline ll findl(ll x){ |
AC
https://atcoder.jp/contests/abc389/submissions/61877078
1 | #include <iostream> |
提交了好多次RE,发现可能是C++23不支持宏定义了
1 | #include <iostream> |
Ans(需要最大化)=k1+k2+⋯+kn
k12∗p1+k22∗p2+⋯+kn2∗pn≤M
购买第 i 种产品的第 j 个花费是
(j2−(j−1)2)∗pi化简(2j−1)∗pi
那不难发现,我们有一个贪心策略,就是优先买便宜的东西,再买贵的东西。
当然,直接这样搞的话,肯定TLE,我们需要找一个价格阈值x,小于x的东西我们买,大于x的东西我们就不买了,最后看总花费是否 ≤ M
https://www.luogu.com.cn/article/imo508fb 然后你会发现WA了两个点,
hack数据:
1 | 2 25 |
同样起始价格为1,有时要买3个,有时要买4个,那怎么解决?
加了下面的小根堆就万无一失了,因为我们将刚刚超过价格阈值的全部记录下来,再跑一遍看看有没有遗失的。
1 | // 下面就是把check(l)的过程再跑了一遍,只不过加了小根堆 |
AC https://atcoder.jp/contests/abc389/submissions/61888808
1 | #include <iostream> |