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;
    }
    

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/84671057