比赛链接: https://codeforces.com/contest/1690
题目解析
如果 n 能够被 3 整除,我们就可以构造一个高度为 (h−1,h,h−2) 的领奖台。且 3h−3=n 。
如果 n 除以 3 的余数不为 0 ,那么我们就从高到低把领奖台高度 +1,这样就仍然保持了领奖台单调性。
参考代码
题目解析
要求 a 数组转化到 b 数组。
首先确保对于所有的 i ,均满足 ai≥bi。
设定需要执行的操作次数是 delta,那么 delta 需要满足以下两个条件:
- 如果 bi=0 ,那么 delta=ai−bi 。
- 如果 bi=0 ,那么 delta≥ai−bi 。
参考代码
题目解析
- 如果 i=1,那么 taski 的实际开始时间是 taski 的到达时间,即 si 。
- 如果 i=1 ,那么 taski 的实际开始时间是 taski−1 的结束时间和 taski 的开始时间的最大值,即 max(si,fi−1) 。
参考代码
题目解析
统计前缀内 B
字符的数目,然后找到一个长度为 k 的区间,区间内 B
字符的数目最多。
参考代码
题目解析
两个物品( ai , aj )一起打包的cost是
⌊kai+aj⌋=⌊kai⌋+⌊kaj⌋+⌊kaimodk+ajmodk⌋
首先计算所有的 ⌊kai⌋ 。
剩余的 ⌊kaimodk+ajmodk⌋ 先处理 aimodk=bi(0≤bi<k) 之后,需要解决的问题就变成了下面这个:
对于 b 的任意一个排列, 求 ∑i=12n⌊kb2i−1+b2i⌋ 的最大值。显然 ⌊kb2i−1+b2i⌋(0≤b2i−1,b2i<k) 的值只能为 0 或者 1。
可以通过贪心来使得 满足 bi+bi+1≥k 的组数越多越好。
参考代码
题目解析
首先计算每个置换环所包含的位置和顺序。
然后暴力处理每个置换环,找到操作之后若干次之后满足当前置换环的状态和初始状态相同的最小的操作次数 opi。
最后求所有 opi 的最小公倍数。
参考代码
题目解析
一个区间合并和拆分问题。
首先想到了用珂学来解决这道问题。
假设有一组数据 10,12,11,9,12,6,9,如下图所示。
虚线代表实际的速度。
那么速度区间就总共有三个,分别是 (1,3),(4,5),(6,7),每个区间的速度等于区间头部的位置的速度。
考虑两种情况,分别用两个独立的case来举例。
一个case是2 1
,即将 a2=a2−1。
速度区间仍然还是 3 个,分别是 (1,3),(4,5),(6,7) 。
这个case意味着:如果将某个位置速度减小之后,此位置速度仍然不小于它所处的区间的速度的值,那么速度区间不会发生合并和拆分。
另外一个case是 3 3
,即 a3=a3−3。
速度区间变成了 3 个,分别是 (1,2),(3,5),(6,7) 。
因为 a3 的速度降低到区间速度以下之后,区间 (1,3) 就拆分成 (1,2),(3,3) 了。
然后依次比较新的区间和后续区间的速度大小,直到后续无区间或者后续区间速度小于当前区间速度。(3,3) 区间的速度小于或等于 (4,5) 区间的速度,故可以合并成区间 (3,5)。 (3,5) 区间速度大于 (6,7) 区间速度,故不合并这两个区间。
这个case代表:如果某个速度减小之后,此位置速度小于它所处的区间的速度,那么速度区间就要进行拆分;如果新区间速度速度不大于后续区间的速度,那么要合并这两个相邻区间,直到后续无区间或者后续区间的速度小于此位置所处的区间的速度。
区间数目即每次查询的结果。
PS: 学过一点珂学,很容易就能想到。
参考代码