1. 程式人生 > >P1083 借教室-二分答案-差分陣列第二彈

P1083 借教室-二分答案-差分陣列第二彈

  • https://www.luogu.org/problemnew/show/P1083
  • 小結:差分陣列,一般並沒有裸的考查,但是差分陣列的思想啊,輔助啊,還是比較常用的
  • 思路:二分答案,列舉最多多少訂單能夠合法。每次檢驗答案按照差分思想檢驗判斷當前訂單數是否超過原來的量
  • #include<bits/stdc++.h>
    using namespace std;
    #define maxn 1234567
    #define ll long long
    ll  n,v,sum[maxn],pre[maxn];
    ll  a[maxn],m,l,r,ans[maxn];
    struct node
    {
        ll l,r,v;
    } id[maxn];
    bool ok(int ss)
    {
        memset(a,0,sizeof(a));
        memset(sum,0,sizeof(sum));
        for(int i=1; i<=ss; i++)
        {
            a[id[i].l]+=id[i].v;
            a[id[i].r+1]-=id[i].v;
        }
        for(int i=1; i<=n; i++)
        {
            sum[i]=sum[i-1]+a[i];
            if(sum[i]>pre[i])return 0;
        }
        return 1;
    }
    int main()
    {
        scanf("%lld%lld",&n,&m);
        for(int i=1; i<=n; i++)
            scanf("%lld",&pre[i]);
        for(int i=1; i<=m; i++)
            scanf("%lld%lld%lld",&id[i].v,&id[i].l,&id[i].r);
        if(ok(m))
        {
            printf("0\n");
            return 0;
        }
        l=1;
        while(l<m)
        {
            ll mid=(l+m)/2;
            if(ok(mid))
                l=mid+1;
            else
                m=mid;
        }
        printf("-1\n%lld\n",l);
        return 0;
    }