传送门 题解搬运工++ 先证明一个贪心做法的正确性:做以下操作若干次,每一次考虑选择没有被选到答案序列中的数加入到答案序列中对答案的贡献,设第\(i\)个位置的贡献为\(V_i\),如果最大的贡献小于0则退出,否则选择其中贡献最大的加入答案序列中. 首先一个引理:在上述贪心策略下,如果\(a_i\)>\(a_j\)且\(i\)<\(j\),则选\(i\)之前不可能选\(j\). 证明考虑归纳:\(i,j\)中间不存在被选中的元素时是平凡的,如果\(i,j\)中间存在\(p\)个选中的元素,若\…
题意 洛谷 做法一 考虑一种贪心(先别管对不对),设当前已选择的集合为\(A\),这是考虑该集合的补集,每个元素加进来后的增量为\(V_i\),则挑选最大的那个加入该集合 结论1:遵循上述贪心,\(\forall i,j(i<j)\),满足\(a_i>a_j\),倘若选\(j\),集合中必定包含\(i\) 归纳: \(i,j\)间没有任何元素在\(A\)中,显然成立 假设若\(i\)加入集合,为\(k_1^{th}\),\(j\)为\(k_2^{th}\),贡献差分一下,假设先选\(j\),即…
题目 我们设\(f_{i,j}\)表示前\(i\)个数中选\(j\)个的最大值. 那么显然有\(f_{i,j}=max(f_{i-1,j},f_{i-1,j-1}+j*a_i)\). 这个东西我们首先可以把它的第一维给滚掉. 然后我们知道这是个\(O(n^2)\)的东西,所以要考虑优化. 有一个结论是\(\forall i\in[1,n],\exist k\in[1,i],s.t.\forall j\in[0,k),f_{i,j}=f_{i-1,j},\forall j\in[k,i],f_{i…
[CF573E]Bear and Bowling 题面 洛谷 题解 首先有一个贪心的结论: 我们一次加入每个数,对于\(\forall i\),位置\(i\)的贡献为\(V_i = k_i\times a_i+b_i\),其中\(k_i\)为位置\(i\)之前被选的数的个数,\(b_i\)为\(i\)之后被选的数的和. 那么我们每次选这个贡献最大的位置一定最优. 然后来证一下这个结论的正确性(直接蒯了\(\text {I} \color{#FF0000} {\text {tst}}\)的): 引…
Bear and Bowling 4 这也能斜率优化... max[ i ] = a[ i ] - a[ j ] - j * (sum[ i ] - sum[ j ])然后就能斜率优化啦, 我咋没想到, 我好菜啊. 斜率优化最重要的是转换成前缀形式, 我TM又忘了. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PLL pa…
Limak is an old brown bear. He often goes bowling with his friends. Today he feels really good and tries to beat his own record! For rolling a ball one gets a score — an integer (maybe negative) number of points. Score for the i-th roll is multiplied…
传送门 题意: 区间加和询问一段区间内整体前缀和的最大值 刚才还在想做完这道题做一道区间加等差数列结果发现这道就是.... 唯一的不同在于前缀和一段区间加上等差数列后,区间后面也要加上一个常数!!! 线段树没法搞吧....分块! 每个块维护整体加标记,首项,公差 修改的时候: 左面不完整的块下放标记暴力重构: 中间的整块打标记: 右面不完整的块也是下放标记暴力重构,注意这个地方$r$之外的部分也要更新! 右面完整的块也要打标记! 怎么查询呢? 左右不完整的块暴力查询 中间的整块,可以发现我们每次…
传送门 分块好题. 题意:维护区间加,维护区间前缀和的最大值(前缀和指从1开始的). 思路: 考虑分块维护答案. 我们把每个点看成(i,sumi)(i,sum_i)(i,sumi​)答案一定会在凸包上,于是我们每个块维护一个凸包. 然后发现 每次前缀和可以分区域修改,在区域内的相当于给所有点的连线加一个斜率,对于区域外的相当于打一个addaddadd标记,于是给每个块维护整体加标记,斜率增加的首项,斜率的增量标记即可. 查询的时候每个块在凸包上二分一波. 代码: #include<bits/st…
好像没有什么高级数据结构能够很高效地实现这个东西: 那就上万能的分块,我们用一些数形结合的思想,把下标看成横坐标,前缀和的值看成纵坐标: 给区间内每个数都加k相当于相邻两点的斜率都加上k: 这种东西我们可以考虑用凸包来维护,因为根据凸包的几何意义,显然最值点在凸包上: 根据凸包的构造方式,相邻两点的斜率都加上k,在凸包中的点集是不变的,这就很好了: 每次二分出斜率为零的地方就好了: #include<iostream> #include<cstring> #include<c…
传送门 一道有意思的题. 一开始想错了,以为一直lowerlowerlower_boundboundbound就可以解决询问,结果交上去TLE了之后才发现时间复杂度是错的. 但是贪心思想一定是对的,每次向前尽量推进一定可以得到最优解. 于是我想起了一道叫做弹飞绵羊的题,感觉这道题可以类比. 码了一会一直WA感觉不太对,发现有一个细节写错了233. A了之后在csdn上翻了翻题解. 发现都是倍增优化%%%,我被自己的低智商给蠢哭了,是啊连修改操作都没有分块很low啊. 不过还是讲讲如何分块吧. 对…