AGC032 A-D题解

发布时间 2023-08-22 16:51:50作者: Idtwtei

A

最后一次插入的数的值与位置一定相同

考虑倒着做

每次从左往右扫一遍

当遇到 a[i]==i 时将此数删除并跳出

B

当 n 为 5 时

构造出的图如下

图形编辑器 (csacademy.com)

那么我们猜想当 n 为奇数时将 n 与其他点连边

i 与除了 n-i 的其他点连边

证明:

n 的邻接点的编号之和为 (n-1)*n/2

i 的邻接点的编号之和为 n*(n+1)/2-i-(n-i)=n*(n+1)/2-n=(n-1)*n/2

满足要求

当 n 为偶数时先按 n+1 连边在将 n+1 删掉即可

C

由于每个点都至少在一个环上,所以每个点的度数一定为偶数

当有一个点的度数大于等于 6 时一定合法

当所有点的度数都为 2 时一定不合法

再考虑点的度数为 2/4 的情况

当只有一个点的度数为 4 时 只能分成 2 个圈

当有两个点的度数为 4 时,通过画图可以发现,当两个度数为 4 的点有两条不相交路径相连时合法,四条则不合法

通过 dfs 判断即可

当度数为 4 的点大于 2 个时 一定合法

D

原操作可以转化为花费A将任意一个数移到该数的右边,花费B将任意一个数移到该数的左边

不难发现每个数最多会移动 1 次

可以将数分为移动的与不移动的

考虑 DP

设 f[i][j] 表示前 i 个数的移动以确定 j 为最后的不移动的数的值时的最小花费

将 f[i][i] 初始化为 A*(i-1) 其他为正无穷

当 a[i]<j 时 f[i][j]=min(f[i-1][j]+B)

当 a[i]>j 时 f[i][j]=min(f[i-1][j]+A) f[i][i]=min(f[i-1][j])

答案为 max(f[n][i]) (i:1->n)