#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int fz = 512;//一组的大小
int n,m,d,s,t,zu;
int r[1000010];
int mn[4048];//每组中的最小值
int cha[4048];//整组都减去一个数,只需记录一下
bool flag;
int main() {
memset(mn,0x4f,sizeof(mn));
cin>>n>>m;
for(int i = 1; i <= n; i++) {
cin>>r[i];
zu = i / fz;
mn[zu] = min(mn[zu] , r[i]);
}
for(int i = 1; i <= m; i++) {
cin>>d>>s>>t;
if(flag)
continue;
if(t-s<=fz*2) {//更新数据少,直接计算
for(int j=s; j<=t; j++) {
r[j] -= d;
zu = j / fz;
mn[zu] = min(mn[zu] , r[j] - cha[zu]);
if(r[j] - cha[zu] < 0) {
cout<<"-1\n"<<i;
flag = true;
return 0;
}
}
}
else {
for(int j=s; j<(((s / fz) + 1) * fz); j++) {//从s到分区结尾
r[j] -= d;
zu = j / fz;
mn[zu] = min(mn[zu] , r[j] - cha[zu]);
if(r[j] - cha[zu] < 0) {
cout<<"-1\n"<<i;
flag = true;
return 0;
}
}
for(int j=(s / fz) + 1; j<(t / fz); j++) {//中间跨几个分组
cha[j] += d;
mn[j] -= d;
if(mn[j] < 0) {
cout<<"-1\n"<<i;
flag = true;
return 0;
}
}
for(int j=(t / fz) * fz; j<=t; j++) {//从分组开头到t
r[j] -= d;
zu = j / fz;
mn[zu] = min(mn[zu] , r[j] - cha[zu]);
if(r[j] - cha[zu] < 0) {
cout<<"-1\n"<<i;
flag = true;
return 0;
}
}
}
}
if(!flag)
printf("0");
return 0;
}
不等输入结束直接return 0。最后一个测试的能过。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int fz = 512;//一组的大小
int n,m,d,s,t,zu;
int r[1000010];
int mn[4048];//每组中的最小值
int cha[4048];//整组都减去一个数,只需记录一下
bool flag;
int main() {
memset(mn,0x4f,sizeof(mn));
cin>>n>>m;
for(int i = 1; i <= n; i++) {
cin>>r[i];
zu = i / fz;
mn[zu] = min(mn[zu] , r[i]);
}
for(int i = 1; i <= m; i++) {
cin>>d>>s>>t;
if(flag)
continue;
if(t-s<=fz*2) {//更新数据少,直接计算
for(int j=s; j<=t; j++) {
r[j] -= d;
zu = j / fz;
mn[zu] = min(mn[zu] , r[j] - cha[zu]);
if(r[j] - cha[zu] < 0) {
cout<<"-1\n"<<i;
flag = true;
continue;
}
}
}
else {
for(int j=s; j<(((s / fz) + 1) * fz); j++) {//从s到分区结尾
r[j] -= d;
zu = j / fz;
mn[zu] = min(mn[zu] , r[j] - cha[zu]);
if(r[j] - cha[zu] < 0) {
cout<<"-1\n"<<i;
flag = true;
continue;
}
}
for(int j=(s / fz) + 1; j<(t / fz); j++) {//中间跨几个分组
cha[j] += d;
mn[j] -= d;
if(mn[j] < 0) {
cout<<"-1\n"<<i;
flag = true;
continue;
}
}
for(int j=(t / fz) * fz; j<=t; j++) {//从分组开头到t
r[j] -= d;
zu = j / fz;
mn[zu] = min(mn[zu] , r[j] - cha[zu]);
if(r[j] - cha[zu] < 0) {
cout<<"-1\n"<<i;
flag = true;
continue;
}
}
}
}
if(!flag)
printf("0");
return 0;
}
使用continue等待输入结束。则最后一组数据过不了。