WA

P2367 语文成绩

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 感谢!


|