80分的代码,两种写法,最后一组测试数据一种能过一种不能过
查看原帖
80分的代码,两种写法,最后一组测试数据一种能过一种不能过
156042
王半仙楼主2023/10/16 14:58
#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等待输入结束。则最后一组数据过不了。

2023/10/16 14:58
加载中...