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;
}
posted @   郭轩均  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示