95PTS求助
查看原帖
95PTS求助
381283
RsveNotiLess楼主2024/6/8 14:35

使用的是差分+二分,时间空间复杂度都能过,WA一个点(测试点8),求调

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,m,rs[N],d1[N],li[N],ri[N],ll=1,rr,mid;
long long c[N];
bool change(int l,int r,int f)
{
	memset(c,0,sizeof(c));
	for(int i=l;i<=r;i++)
	{
		c[li[i]]+=d1[i]*f;
		c[ri[i]+1]-=d1[i]*f;
	}
	for(int i=1;i<=n;i++)
	{
		c[i]+=c[i-1];
		if(c[i]>rs[i]) return false;
	}
	return true;
}
int main()
{
	scanf("%d%d",&n,&m);
	rr=m;
	for(int i=1;i<=n;i++)
		scanf("%d",&rs[i]);
	for(int i=1;i<=m;i++)
		scanf("%d%d%d",&d1[i],&li[i],&ri[i]);
	while(ll<=rr)
	{
		mid=(ll+rr)>>1;
		if(change(1,mid,1)) ll=mid+1;
		else if(change(1,mid-1,1)) break;
		else rr=mid-1;
	}
	if(mid==n) printf("0");
	else printf("-1\n%d",mid);
	return 0;
}
2024/6/8 14:35
加载中...