【洛谷P1083】借教室

这个题目我们可以二分最多能够满足多少订单,每一次计算每天所需教室的数量(利用差分的思想打个标记,求个前缀和),看是否能够将这些订单全部满足,这样最坏的时间复杂度是nlogm,属于可以接受的范围内

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long long n,m,a[1000010],ne[1000010],ans,l,r;
struct in
{
    long long c,f,l;
}ter[1000010]; 
bool check(int x)
{
    memset(ne,0,sizeof(ne));
    long long q=1000000007,h=-1000000007;//记录枚举的起点和终点,进行优化 
    for(int i=1;i<=x;i++)
        ne[ter[i].f]+=ter[i].c,ne[ter[i].l+1]-=ter[i].c,q=min(q,ter[i].f),h=max(h,ter[i].l);
    for(int i=1;i<=n;i++)
    {
        ne[i]+=ne[i-1];
        if(ne[i]>a[i])
            return 1;
    }
    return 0;
}
int main()
{
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    l=1,r=n+1;
    for(int i=1;i<=m;i++)
        scanf("%lld%lld%lld",&ter[i].c,&ter[i].f,&ter[i].l);
    while(l<=r)//二分最多能够满足多少订单 
    {
        int mid=l+r>>1;
        if(check(mid))
            ans=mid,r=mid-1;
        else
            l=mid+1;
    }
    if(!ans)//l一直上升,说明全部满足 
        printf("0");
    else
        printf("-1\n%lld",ans);
    fclose(stdin);
    fclose(stdout);
    return 0;
}

 

posted @ 2017-11-02 09:42  那一抹落日的橙  阅读(232)  评论(0)    收藏  举报