newbie_001 @ 2024-03-31 20:04:33
#include <iostream>
using namespace std;
const int N = 5000010;
int n,p;
int a[N];
int min_num = 0x3f3f3f3f;
int main(){
cin >> n >> p;
for(int i = 1;i <= n;i ++) cin >> a[i];
for(int i = 2;i <= n;i ++) a[i] -= a[i - 1];
while(p --) {
int l,r,x;
cin >> l >> r >> x;
a[l] += x;
a[r + 1] -= x;
}
for(int i = 1;i <= n;i ++) a[i] += a[i - 1];
for(int i = 1;i <= n;i ++){
if(a[i] < min_num) min_num = a[i];
}
cout << min_num;
return 0;
}
这个代码为啥过不了啊啊?
by luoguerepp @ 2024-04-05 10:56:59
这个有问题
for(int i = 2;i <= n;i ++) a[i] -= a[i - 1];
你的本意是要初始化差分数组,但是直接用后者减去前者,就不止会减去前一项输入的值 比如样例的 1 1 1 初始化差分后应该是
1 1 1 // 原输入
-1 -1 // 后一赋前一项的负值
1 0 0 //最终的值
如果按照你写的就是
1 1 1 //输入
1 0 1 //直接用后一项减去前一项
改成这样就可以过了
int x;
cin >> x;
a[i] += x;
a[i + 1] -= x;
by newbie_001 @ 2024-04-07 22:18:49
@luoguerepp 感谢!