题目链接: https://www.luogu.com.cn/problem/P4552
题目描述:
给定一个长度为 𝑛 的数列 𝑎1,𝑎2,⋯ ,𝑎𝑛,每次可以选择一个区间[𝑙,𝑟],使这个区间内的数都加 1 或者都减 1。
请问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列有多少种。
输入格式:
第一行一个正整数 𝑛
接下来 𝑛 行,每行一个整数,第 𝑖+1行的整数表示 𝑎𝑖。
输出格式:
第一行输出最少操作次数
第二行输出最终能得到多少种结果
输入输出样例:
输入 #1
4 1 1 2 2
输出 #1
1 2
说明/提示
对于 100%100% 的数据,𝑛≤100000,0≤𝑎𝑖≤231n≤100000,0≤ai≤231。
代码:
// Problem: P4552 [Poetize6] IncDec Sequence
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4552
// Memory Limit: 128 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5+5;
int n,a[N];
int b[N];
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
b[i]=a[i]-a[i-1];
}
//一个区间加减就是差分数组一个数加一个数减
//那么就可以让差分数组负数+,正数-,即抵消的意思
int p=0,q=0;
for(int i=2;i<=n;i++){
if(b[i]>0){
p+=b[i];
}
else{
q-=b[i];
}
}
//储存答案的时候就是,当正负数抵消之后,
//除b[i]外其他的差分数组都为0的意思是其他数都相同但是和b[1]一样
//怎么算b[1]呢,就是考虑一步步加或者一步步减的时候,
//因为一步步加或者一步步减实质上是带着第一个的
//b[1]-1,b[i]+1或者b[1]+1,b[i]-1
int ans1=max(p,q);
//本身有一个值,不操作的时候
int ans2=abs(p-q)+1;
cout<<ans1<<"\n"<<ans2<<"\n";
return 0;
}