P1083 [NOIP2012 提高组] 借教室

-》d<=1e9 -> long long or 溢出

//d<=1e9 -> long long or 溢出
/*
4 3 
2 5 4 3 
2 1 3 
3 2 4 
4 2 4

-1
2

4 6
1000000000 1000000000 1000000000 1000000000
1000000000 1 4
1000000000 1 4
1000000000 1 4
1000000000 1 4
1000000000 1 4
1000000000 1 4

-1
2
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------debug\n");
using namespace std;
const int maxn=1e6+10;

ll a[maxn],nd[maxn],dif[maxn],n,m,s[maxn],t[maxn],d[maxn];

ll pd_ok(int k)
{
    memset(dif,0,sizeof(dif));
    memset(nd,0,sizeof(nd));
    for(int i=1;i<=k;i++){ dif[s[i]]+=d[i],dif[ t[i]+1 ]-=d[i];}
    for(int i=1;i<=n;i++)
    {
        nd[i]=nd[i-1]+dif[i];
        if(nd[i]>a[i]) return 0;
    }
    return 1;
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++)  cin>>a[i];
    for(int i=1;i<=m;i++)  cin>>d[i]>>s[i]>>t[i];
    
    if(pd_ok(m)) {cout<<"0"<<endl;return 0;}
    
    int l=1,r=m;
    while(l<r)
    {
        int mid=(l+r)>>1;
        if(pd_ok(mid)) l=mid+1;//
        else r=mid;
    }
    cout<<"-1"<<endl<<l<<endl;
    return 0;
}
View Code
 

 

 
posted @ 2023-07-15 09:48  JMXZ  阅读(7)  评论(0)    收藏  举报