Atcoder-Beginner-Contest-#263D题解
Atcoder Beginner Contest #263 D - Left Right Operation
题目大意
给定一串长度为的数列, 可以进行如下操作, 每种最多一次:
- 将赋值为
- 将赋值为
求出操作后数列的最小值
数据规模
我的思路(错)
对于数列,处理出前缀和le
和后缀和ri
从前往后遍历, 求出从头替换的数列最小值及其替换位置pos1
从后往前遍历, 求出从尾替换的数列最小值及其替换位置pos2
然后比较pos1
和pos2
的大小, 分情况讨论
大佬代码
heno239
对于数列变换后的数列的每一位, 只有三种可能:
- 被填充为
- 保持不变
- 被填充为
且三种情况必须顺次出现.
所以对于每一位数字, 对应每种情况存在三个状态, 且每个状态只能转移到大于等于该状态编号的状态:
1 | rep(i, n) |
时间复杂度
hank55663
代码非常简短.
预处理ans = r * n
对于每一位数字, 计算其前缀和的最小值pre = min(pre + a[i], (i + 1) * l);
,同时计算出答案ans = min(ans, (n - i - 1) * r + pre);
时间复杂度
hitonanode
预处理数组left
和right
:
left[i]
表示若将数列从头至第i
位替换为, 与原数组的差right[i]
表示若将数列从第i
为至末尾替换为, 与原数组的差
对于每一位i
,寻找数列和加上left[i]
以及从此位至末尾最小的right[j]
的值,记录并更新答案
时间复杂度