Divide by the classroom

Divide by the classroom

#include<iostream>
using namespace std;

#define ll long long

int n,m;

ll b[1000005];
ll a[1000005];   //记录差分后的数组 
ll sum[1000005];  //记录数据处理后 
ll aa[1000005];    //copy 数组a,避免每次询问改变数组a 

struct{
    
    
	int days;
	int beg;
	int end;
}tic[1000005];


bool get(int s)
{
    
    
	for(int i=1;i<=n;i++)     
	{
    
    
		aa[i]=a[i];
	}
	
	for(int i=1;i<=s;i++)   //见差分思想 
	{
    
    
		aa[tic[i].beg]-=tic[i].days;
		aa[tic[i].end+1]+=tic[i].days;
	}
	
	for(int i=1;i<=n;i++)
	{
    
    
		sum[i]=sum[i-1]+aa[i];
		if(sum[i]<0)
		{
    
    
			return 0;
		}
	}
	return 1;
	
}

int main()
{
    
    
	
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
    
    
		scanf("%lld",&b[i]);
		a[i]=b[i]-b[i-1];
	}	
	
	for(int i=1;i<=m;i++)
	{
    
    
		scanf("%d%d%d",&tic[i].days,&tic[i].beg,&tic[i].end);
	}
		
	int l=1;
	int r=m+1;
	
	int mid;
	bool ok;
	
	while(l<r)   // 【l,r) 
	{
    
    
		mid=(l+r)/2;
		
		ok=get(mid);
		
		if(ok)
		{
    
    
			l=mid+1;
		}else {
    
    
			r=mid;
		}
	}
	
	
	if(l>m)   //都满足  
	{
    
    
		cout<<0;
	}else if(!get(l))
	{
    
    
		cout<<-1<<endl;
		cout<<l;
	}else {
    
    
		cout<<0;
	}
	
	return 0;
}

Guess you like

Origin blog.csdn.net/weixin_45448563/article/details/113733418