Solution - Educational Codeforces Round 183 (Rated for Div. 2)
Educational Codeforces Round 183 (Rated for Div. 2)
A. Candies for Nephews
Solution
模3。
Code
Show Code
1 | signed main() { |
B. Deck of Cards
Solution
如果,则全部输出-,如果:
假设一开始全是+。
- 如果遇到
0,则把从左往右第一个?变成-,第一个+变成?; - 如果遇到
1,则把从右往左第一个?变成-,第一个+变成?; - 如果遇到
2,则把从左往右第一个+变成?,从右往左第一个+也变成?。
模拟即可。
Code
Show Code
1 | const int N = 2e5 + 1; |
C. Monocarp’s String
Solution
设a为,b为,则问题转化为找到最短的区间,使得该区间的和等于整个序列的和。
如果序列和为,输出。否则我们可以从左往右枚举区间的右端点。
设表示的和,则每次对于我们只需要找到即就行了,并且是最大的。从左往右将加入表,每次取下标最大值即可。复杂度。
Code
Show Code
1 | const int N = 2e5 + 1; |
D. Inversion Value of a Permutation
Solution
这是一道dp求方案。
首先,由于统计的是有逆序对的字串数量,只有时才有实际的贡献,其他逆序对都可以用这个代替。
假设我们前个数已经摆好,则个数加入时多出来的个区间,要不继承第个数产生的逆序字串数量,即,要不产生新的逆序子串,即。
设表示前个数,从左往右数第和个数产生了最右端的逆序对,逆序子区间数为能否达到。转移时,分为两种情况:
- ,;
- ,;
这个dp是的。最后再倒过来dp出答案即可。
E. Predicting Popularity
Solution
每次询问完,实际上我们都知道每个人需要有几个人看才会看这个电影,而且每次相当于只修改一个人的状态。
设第个人会看这个电影需要最少他人为,则只有所有的人都看电影,并且这些人的数量,第个人才会看。
不妨设的人的数量为,令,则问题转化为求最小的使得。
在的基础上开一个最小值线段树,每次需要区间和区间,以及查询最小的小于的下标(递归每次优先往左即可)。
时间复杂度。
Code
Show Code
1 | int n, ac, dr; |
F. Long Journey
Solution
设,则。
首先,最优方案是固定的:
- 如果下一格不会被炸死,那就走,因为待会走过去不如现在走过去(不可能存在相邻两格同时都是炸弹);
- 如果下一格会被炸死,就不动(你也干不了啥了)。
其次,走不动的话就会在一个格子呆了个回合还动不了,并且在步内这个情况就会出现,否则就没有这个情况。
然后,我们可以发现,如果存在两个状态和满足且,则这两个状态之后的任何行为都将相同,所以我们可以开一个map记录状态,最多有个,也就是说最多走次后就会产生循环。
所以我们暴力往前走,如果发现走不动则报告无解,发现走到相同状态则跳出循环,利用后面的重复步数快速计算出答案。
时间复杂度。
Code
Show Code
1 | using LL = long long; |