Atcoder ARC 120

A

(;)
会发现每次操作后当前数会变成序列中最大值,预处理出(na_1+(n-1)a_2+cdots +a_n)和前缀最大值直接计算即可
总结:推柿子题
(;)

B

(;)
容易发现,处在同一对角线上的格子颜色必须相同,如果有两种颜色同时出现在一个对角线上,显然无解。
否则乘法原理算一下就好了。
总结:对于这种只能向下和向右的走的问题,路径会经过每一种对角线一次,不妨站在对角线的角度来看问题
(;)

C

(;)
操作时序列的总和不会变,所以若(sum A eq sum B),就无解。
显然,在操作中向左走的数会+1,向右走的会-1,但(A_i+i)是不会变的。
所以按照(A_i+i,B_i+i)分组,现在问题转化为(A)中的每个数都要找到(B)中和它匹配的位置,让操作总数最小。
假如我们已经得到在(B)中与(A_i)匹配的位置(C_i)
而操作数就是(C_1,C_2,cdots,C_n)这个序列的逆序对个数
证明:
我们首先会把(C_i=n)移到序列末尾,这样就再不用去管他了,然后接着就是(C_i=n-1,n-2,cdots,1)
会发现,对于每个(C_i=x),在往后走的过程中,都会与其后面(C_i<x)的数发生一次交换。
不过在算逆序对时候,也要判一下是否有解(大概就是看同组的数的数量是否相同)
总结:对于一个排列(A),每次操作可以交换相邻两个数,那么让其变成({1,2,3,cdots,n})最少需要其逆序对个数的次数
(;)

D

(;)
先把(A)从小到大排序
显然不管怎么匹配,让在(1leq xleq n,n<y eq 2n)这样的(x,y)匹配更好。
这样我们一定可以构造出一组方案,从前往后做一遍括号匹配即可
总结:不妨可以考虑一些特殊构造使得答案最大化
(;)

E

(;)
按照贪心策略,一个人初始会先选择一个方向,碰到人之后立马返回去碰另外一个人。
可以画出横轴为位置,纵轴为时间这样的坐标系去思考,会更加直观。
会发现,不可能连续三个人初始时方向相同,因为如果让其中两个人匹配(对着走),显然会更优。
对于dp来说,我们可以强制(i)(i-1)是匹配的,这样根据(i-2)向左向右两种不同的走法,就有两种转移

[ dp_i = egin{cases} dp_{i-2}+a_i-a_{i-3} \ dp_{i-3}+a_i-a_{i-4}\ end{cases} ]

总结:对于一维问题,涉及到多点同时移动,可以画出时间与位置的坐标系,方便考虑。
另外对于这种比较抽象的dp,可以尝试去强制某些条件,以达到减小情况数量,方便转移
(;)

Code

(;)
A:https://atcoder.jp/contests/arc120/submissions/22862625
B:https://atcoder.jp/contests/arc120/submissions/22864912
C:https://atcoder.jp/contests/arc120/submissions/22872612
D:https://atcoder.jp/contests/arc120/submissions/22905914
E:https://atcoder.jp/contests/arc120/submissions/22924677
(;)

原文地址:https://www.cnblogs.com/czyty114/p/14819804.html