P4552 [Poetize6] IncDec Sequence(差分)
像这种对区间进行加以或者减一的操作多半要用差分,要使所有数一样,就是要让除b[1]以外的其他数等于零,因为b[1]是a[1]与a[0]的差值,要求有多少结果就是求b[1]有多少可能,我们先让b[2]到b[n]的数一个加一一个减一,直到只剩一个数,要进行min(abs(fu),zheng)次,然后还剩abs(zheng+fu),然后让该数跟b[1]和b[n+1]进行操作,跟b[1]操作可理解为让该数的前一位数和第一个数进行操作,与b[n]操作可看作让该数到第n个数加一或者减一,那么b[1]就有abs(zheng+fu)+1种可能,至少进行max(-fu,zheng)次操作
#include<iostream>
#include<set>
#include<map>
#include<algorithm>
#include<vector>
#include<cmath>
#include<climits>
#include<cstring>
#define int long long
const int N = 1e6;
using namespace std;
char* p1, * p2, buf[100000];
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int read()
{
int x = 0, f = 1;
char ch = nc();
while (ch < 48 || ch>57)
{
if (ch == '-')
f = -1;
ch = nc();
}
while (ch >= 48 && ch <= 57)
x = x * 10 + ch - 48, ch = nc();
return x * f;
}
int a[N], b[N], c[N];
int p[N];
int cha[N];
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
int zheng = 0;
int fu = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i];
b[i] = a[i] - a[i - 1];
if (i >= 2) {
if (b[i] < 0)fu += b[i];
if (b[i] > 0)zheng += b[i];
}
}
cout << max(-fu, zheng) << endl;
cout << abs(zheng + fu) + 1;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效