洛谷P10133 题解

一道差分黄题(但我似乎并没有用差分)

原题指路

题意简述

给定有 \(n\) 个元素的数组 \(a\)

可以在任意位置 \(i\) 向后加上(或减去)一个首项为 1,公差为 1,长度为 \(n\)\(i\) + 1(即结束点为 \(n\))的等差数列。

问需要加(或减)几个等差数列可使 \(a\) 中的值全为 \(0\)

思路解析

想了很久不知道怎么写,所以乱水一点。

从第一个元素开始向后遍历,依次将每个元素清零。

使用两个变量 \(flag\)\(cs\)
\(flag\) 记录当前元素需要改变的值,\(cs\) 记录 \(flag\) 需要改变的值。

对于第 \(i\) 个元素而言,先将它改变 \(flag\),之后通过当前元素的值改变 \(cs\) 的值,然后改变 \(flag\) 的值。

代码展示

#include<bits/stdc++.h>
#define int long long

using namespace std;

const int N = 2e5 + 100;
int n, a[N], ans, flag, cs;

signed main(){
	
	freopen("bact.in", "r", stdin);
	freopen("bact.out", "w", stdout);
	
	scanf("%lld", &n);
	for(int i = 1; i <= n; i++){
		scanf("%lld", &a[i]);
	}
	
	for(int i = 1; i <= n; i++){
		flag += cs;
		a[i] += flag;
		if(a[i] == 0) continue;
		flag += (a[i] * -1);
		ans += abs(a[i]);
		cs += (a[i] * -1);
	}
	
	printf("%lld", ans);
	
	return 0;
}
posted on 2025-12-13 17:10  Chronomia  阅读(4)  评论(0)    收藏  举报