Educational Codeforces Round 123 (Rated for Div. 2) A~E 题解

比赛链接

A

直接扫一遍判断即可。

Code:https://pastebin.ubuntu.com/p/qnZxhMswtW/

B

把排列倒过来,每次把 \(p_1\)\(p_i\) 交换即可。

其实……这不是随便构造?

Code:https://pastebin.ubuntu.com/p/p8BRcZPRN3/

C

其实相同长度的子段只需要考虑和最大的那一个。

那就存下来,每次查询的时候扫一遍就行了。

Code:https://pastebin.ubuntu.com/p/93K2k3fG3s/

D

对于每次操作,如果这次操作的行和列以后都会被重新染过,那么这次操作就没有效果。

同样,如果这次操作后全部格子都重新染了,这次操作也没有用。

所以倒着扫一遍,标记一下被操作过的行列就行了。

Code:https://pastebin.ubuntu.com/p/MrB4G2XDTy/

E

容易发现,如果固定一段后缀不动,并且与之对应的前缀里 RD 都有,那么能够走到的范围就是一个矩形区域。

具体的,如果执行完这个前缀的操作后走到了 \((x,y)\),执行这个后缀的“逆操作”(即初始在 \((n,n)\),从后往前扫操作序列,D 对应向上走,R 对应向左走)后走到了 \((nx, ny)\),那么以 \((x,y)\) 为左上角,\((nx,ny)\) 为右下角的矩形区域就都能走到。

考虑每次往前走一位,如果这一位是 D,那么 \((x,y)\to(x-1,y)\)\((nx,ny)\to(nx-1,ny)\);如果这一位是 R,那么 \((x,y)\to(x,y-1)\)\((nx,ny)\to(nx,ny-1)\)。分别相当于把矩形向上平移 / 向左平移一个单位长度,这个比上次多出来的贡献可以直接算(即加上矩形的长 / 宽)。

注意在执行到一个前缀没有 D 或没有 R 的时候就直接加上这个前缀的长度,因为矩形已经移不动了。

Code:https://pastebin.ubuntu.com/p/qc4VspzvJf/

posted @ 2022-03-02 20:33  csxsi  阅读(30)  评论(0编辑  收藏  举报