1 solutions

  • 0
    @ 2025-3-7 18:24:49

    nlogdnlogd

    容易得到当前ii天不能满足的时候,前i+xi+x天也一定不能满足,反之如果前ii天满足,那么前ixi-x天也一定满足,所以可以二分当前天数,判断当前天是否满足.

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N=1e7+10;
    int n,m;
    int r[N],d[N],s[N],t[N];
    LL b[N];
    bool check(int k)
    {
    	for(int i=1;i<=n;i++)  //计算差分 
        {
            b[i]=r[i]-r[i-1];
        }
    	for(int i=1;i<=k;i++) //处理前k个任务 
        {
    		b[s[i]]-=d[i];
    		b[t[i]+1]+=d[i];
    	}
    	LL res=0;
    	for(int i=1;i<=n;i++)
        {
    		res+=b[i];
    		if(res<0) return true; //某一天的任务不够 
    	}
    	return false; //任务可以满足 
    }
    int main()
    {
    	cin>>n>>m;
    	for(int i=1;i<=n;i++) 
        {
            cin>>r[i]; //r[i]可以使用的教室数量 
        }
    	for(int i=1;i<=m;i++) 
        {
           cin>>d[i]>>s[i]>>t[i];//获取第i个任务的个数,起点,终点 
        }
    	int l=1,r=m;
    	while(l<r) //枚举当前的任务个数 
        {
    		int mid=l+r>>1;
    		if(check(mid)) r=mid; //大于等于mid的都不可以 
    		else l=mid+1; //1...mid可以满足 
    	}
    	if(check(r)) cout<<-1<<endl<<r;
    	else printf("0");
    	return 0;
    }
    
    
    
    
    • 1

    Information

    ID
    1098
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    10
    Tags
    # Submissions
    1
    Accepted
    1
    Uploaded By