#20019. [Senoir] Contest 19/8/11/4 - Problem D:序列
题目传送:https://tywzoj.top/problem/20019
对于区间操作 最常见的做法是差分
在进行差分后我们发现需求变成了单点修改,最终将差分数组全部归零(即每项a[i]不存在差异
再看修改操作 每次修改在a[op]加一,在a[ed+1]剪1(op可以等于0,ed可以等于n),所以需要修改次数即为差分数组中正数与负数取max
!:(这里的正数和负数指正数和负数的绝对值数值和)
再在操作次数最少得前提下求方案数 在上述操作中会产生分支的是在操作了min(正数,负数)次后,所以分支数为abs(正数-负数)+1
以原数组1 3 2 4为例,差分数组2 -1 2,正数和为4,负数为1,最少需要操作4次;产生分支情况在操作1次后,会产生都变成1,2,3,4四个分支。
代码如下:(不开long long见祖宗😅
#include <bits/stdc++.h>
using namespace std;
long long n, zs = 0, fs = 0, temp, tempp, cf[100005];
int main() {
freopen("sequence.in", "r", stdin);
freopen("sequence.out", "w", stdout);
scanf("%lld", &n);
for (int i = 1; i <= n; i++) {
scanf("%lld", &temp);
cf[i] = temp - tempp;
tempp = temp;
}
for (int i = 2; i <= n; i++) {
if (cf[i] > 0)
zs += cf[i];
else if (cf[i] < 0)
fs -= cf[i];
}
printf("%lld\n%lld", max(zs, fs), abs(zs - fs) + 1);
return 0;
}