
前缀和与差分
S atur
要变成萤火虫~
展开
-
1007.Photoshop Layers (十六进制 / 前缀和)(2021“MINIEYE杯”中国大学生算法设计超级联赛3)
传送门题意: 有n层具有颜色涂层,其颜色由Ri, Ci,Bi三个指标对应6个长度的16进制数表的。现问你 [li, ri]区间涂层的颜色重叠在一起是什么颜色。重叠规则如下: * 若第i层的 wi==1,那么它只会显示自己的颜色(Ri,Gi,Bi)。 * 若第i层的 wi==2,那么它的颜色就是自身与先前层次的颜色和(min(Rp+Ri,255),min(Gp+Gi,255),min(Bp+Bi,255),颜色会有上限255。针对 p 次询问回答每个区间最后的颜色是什么。...原创 2021-07-27 18:26:32 · 259 阅读 · 0 评论 -
J. Stop Counting (最大平均前缀|后缀) (2021年度训练联盟热身训练赛第三场)
传送门思路:要求找到去除一个数列中间的一个连续片段后剩下数的平均值Max。显然这个Max的最小值为0,我们利用最大平均值前缀和最大平均值后缀处理更新一下即可。C++代码实现:#include<bits/stdc++.h>#define endl '\n'#define null NULL#define ll long long#define int long long#define pii pair<int, int>#define lo原创 2021-03-29 00:49:16 · 345 阅读 · 0 评论 -
Codeforces C. Longest Simple Cycle (Round 103 Rated for Div.2)(贪心 / 思维)
传送门题意: 现有 n 条链,第 i 条链的头结点连接第 i-1 条链的第 a[i] 号点,其尾结点连接第 i-1 条链的第 b[i] 号点;先让你找出最大的环的边数。思路:从前往后扫一遍,求一个答案的最大值就好。如果当前链被下一条链连接的是同一个结点,那么表示环到当前位置必须结束了,且开始下一个环,更新中间答案 tmp == 0。扫描的过程中也要考虑在当前(每一条)链结束会不会答案更大的情况。同样还要注意,如果以当前链为环的起点会不会比前面的起点答案更大。具体细节都注释在代码中。原创 2021-02-02 17:53:59 · 173 阅读 · 1 评论 -
Codeforces D. Cleaning the Phone (#697 Div.3) (二分 & 前缀和)
传送门题意: 有 n 个软件,第 i 个软件占 a[i] 的内存, 但有 b[i] 的贡献;现让删除一些软件,使得释放的空间达到 m 及以上,但牺牲的贡献值又要最小,并输出牺牲的最小贡献值。思路: 参考于大佬博客根据贡献值分别为 1 和 2 将内存 a 分成 a1 和 a2两个组,肯定先删内存大的软件,再按照内存大小降序排序。所以贡献值为 1 的 a1 内的软件优先被删除,再利用二分 + 前缀和的方法找到除了 a1 外 a2 内再删除多少个能使得删除内存经量大。再得注意,也许只删除 a2 中最原创 2021-02-02 17:24:18 · 216 阅读 · 0 评论 -
Codeforces C. Circle of Monsters (思维贪心 / 前缀和)
传送门题意: 有n个怪兽围成一圈,第i个怪兽都有一个a[i]的生命值和一个b[i]的危害值。你只能选一个起点开始按准时针挨个击杀它们,每次击打伤害值为1。当某个怪兽的生命值<=0时就会爆炸对下一个怪兽产生b[i]的伤害,依次发生连锁反应。试问将所有怪兽击毙至少需要多少次攻击。思路:根据题意可知,只有挨着挨着按顺序击杀怪兽,而击杀所有怪兽的基本差值和是一定的,攻击次数主要取决于起点的选择。所有我们对起点进行枚举就好,记得在枚举是要先减去之前该点的差值再加该点的怪兽生命值a[i]。代码实现原创 2020-11-04 22:14:35 · 635 阅读 · 0 评论 -
CCPC 2020威海站 H. Message Bomb (差分&前缀和)
PTA重现赛入口题意: 有 n个组(初始都为空组), m个学生, s个事件。每次事件输入t, x, y。t == 1: 将学生x加入y组,保证之前不存在。t == 2: 将学生x从y组中删除,保证之前存在。t == 3: 学生x向y组中其他成员宣布一则事件。试求每个学生接收到的事件数。思路:直接利用前缀和与差分的思维处理组员数的变化带来的改变。数组 vg[i]表示第i组总共接收过的事件数,数组vs[i]表示第i个学生总共接收到的事件数,再利用m个set集合存 每个学生加入的队伍情况原创 2020-10-29 01:32:05 · 331 阅读 · 0 评论 -
Codeforces C. Array Splitting (Round 69 Rated for Div.2) (思维 / 贪心 | 差分)
传送门题意: 试图将一个非递减数列分成k段,使得每段的max-min的和最小,并求得最小值。思路:个人觉得是个贪心,过题后去看博客大多数都是差分思维。将所求的式子整理下就会发现每次的消耗都是每段的段尾减段首,而换个思维就是求 |整个数列的段尾减段首| 再减去期间k-1个缝隙的差的绝对值。那么我们就需要减经量多才会使得最后消耗min。于是我们将所有n-1个可能缝隙的差值排序,取绝对值前k-1大的数进行计算即可啦。代码实现:#include<bits/stdc++.h>#de原创 2020-10-27 01:41:05 · 197 阅读 · 0 评论 -
Codeforces C. Stripe (Round #18 Div.2 Only) (前缀和水题)
传送门题意: 看了半天没看懂那个平方数的意思,理解就是求有几种方法可以一刀将数组切成两半,使得左右两半的和相等。思路: 利用前缀和就很容易求得左右两段分别的和。代码实现:#include<bits/stdc++.h>#define endl '\n'#define ll long long#define int long long#define IOS ios::sync_with_stdio(0); cin.tie(0);cout.tie(0);using namespac原创 2020-10-27 00:50:55 · 243 阅读 · 0 评论