文章首发于我的个人博客:欢迎大佬们来逛逛
Dashboard - Codeforces Round 859 (Div. 4) - Codeforces
A
直接 + 或者 - 模拟即可。
B
分别计算偶数的总和
和奇数的总和
,然后比较偶数的和是否严格大于奇数的和即可。
C
题目要求把由 26 个字母组成的字符串转换为 01 串,要求统一个字母对应的 0或者1的情况是唯一的。
也就是说如果字母a第一次出现,并且对应一个0或者1,则后面所有的a都是与之对应的。
利用哈希表可以维护某个字母对应的0或者1 ,也可以使用array<int,26>来模拟。
并且维护一个随着每个位置变换的pre,每次pre^=1,并且把这个pre映射到当前字母所在的哈希表中,如果往后到某个字符出现在哈希表中,但是其对应的字母却与pre不一致,则说明一定无法构成01串。
D
题目要求是有几个询问,然后给出 l,r,num,让我们把[l,r]的数字都改为num
,然后计算整个序列中所有元素之和。
利用前缀和presum维护即可。
则每次的更新就是 p r e s u m [ r ] − p r e s u m [ l − 1 ] + ( r − l + 1 ) ∗ n u m presum[r]-presum[l-1]+(r-l+1)*num presum[r]−presum[l−1]+(r−l+1)∗numdi
E
交互题,直接跳过
F
题目要求:一个小球在地图上移动,每次碰到墙壁都会反弹,每次碰到角落都会逆着往回走,给定一个终点,询问经过几次碰撞可以到达这个终点。
小球一共可以移动 4nm 个状态
,因此我们建立一个这样的数组,并且对方向进行一个合适的判断,例如我们分别设:DL UL DR UR 为 0,1,2,3
这样我们就可以方便的进行如下的更新:
- 四个边界的判定,记录碰壁的次数。
- 移动的过程中小球的位置更新。
并且每次移动我们都记录这个位置的状态被保存过,如果第二次访问过了这个状态,则说明是回路。
如果我们到达了终点,则输出碰壁的次数。
G1, G2
题目要求:给你一个目标数组,问你是否能只通过一个原始{1} a数组来合成,合成的原因是a数组的子序列和可以作为新的元素插入。
我们给目标数组
进行排序,如果它的某位置元素大于这个位置之前的所有元素之和,则表示这个元素无论如何也不可能得到,它后面的元素更不要说了。
因此排序后记录前缀和然后依次比较即可。