洛谷P1083

Keywords: #algorithm #solution

可以发现,当第 $ i $ 个订单可以满足时,第 $ i-1 $ 个订单也可以满足.

于是可以想到二分答案求解,差分计算每个订单,复杂度 $ O(n\log{n}) $ .

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; 
long long num[1000006];
long long r[1000006],n,m,res;
struct Node{
	long long l,r,k;
}node[1000006];
int check(long long x){
	res=0;
	memset(num,0,sizeof num);
	for(int i=1;i<=x;i++){
		num[node[i].l]+=node[i].k;
		num[node[i].r+1]-=node[i].k;
	}
	for(int i=1;i<=n;i++){
		res+=num[i];
		if(res>r[i]){
			return  0;
		}
	}
	return 1;
}
int main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&r[i]);
	}
	for(int i=1;i<=m;i++){
		scanf("%lld%lld%lld",&node[i].k,&node[i].l,&node[i].r);
	}
	long long l=0,r=m;
	while(l<r){
		long long mid=(l+r+1)>>1;
		if(check(mid)){
			l=mid;
		}
		else{
			r=mid-1;
		}
	}
	if(l==m){
		printf("0");
	}
	else{
		printf("-1\n%d",l+1);
	}
	return 0;
}

注意开long long(大悲)