zoukankan      html  css  js  c++  java
  • $Noip2012/Luogu1083$ 借教室

    $Luogu$

    $Sol$

    区间整体加减? 差分+树状数组维护前缀和!

    那每给一个人借完教室之后都要判断一下现在合不合法?那复杂度比暴力还不如些...

    注意到这里的单调性,假设给前$x$个人借完教室之后就不合法了,那给前$x+1,x+2.....$个人借教室一定也是不合法的.于是可以二分第一个需要修改申请的人,然后$check()$.$check()$里在借完所有的人教室之后再判断合不合法就好了,而且就用不着树状数组了.

    $upd:$还有一种方法,是线段树,比较简单粗暴易想,维护区间减和区间$min$值即可.

    $over.$

    $Code$

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    #define il inline
    #define Rg register
    #define go(i,a,b) for(Rg int i=a;i<=b;++i)
    #define yes(i,a,b) for(Rg int i=a;i>=b;--i)
    #define mem(a,b) memset(a,b,sizeof(a))
    #define ll long long
    #define db double
    #define inf 2147483647
    using namespace std;
    il int read()
    {
        Rg int x=0,y=1;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
        return x*y;
    }
    const int N=1000010;
    int n,m,r[N],d[N],s[N],t[N],a[N],as;
    il bool ck(int x)
    {
        mem(a,0);
        go(i,1,x)
        {
            a[s[i]]+=d[i];
            a[t[i]+1]-=d[i];
        }
        Rg int nw=0;
        go(i,1,n){nw+=a[i];if(nw>r[i])return 1;}
        return 0;
    }
    int main()
    {
        n=read(),m=read();
        go(i,1,n)r[i]=read();
        go(i,1,m)d[i]=read(),s[i]=read(),t[i]=read();
        Rg int l=1,r=m,mid;
        while(l<=r)
        {
            mid=(l+r)>>1;//cout<<l<<" "<<r<<" "<<mid<<endl;
            if(ck(mid))as=mid,r=mid-1;
            else l=mid+1;
        }
        if(!as)printf("0
    ");
        else printf("-1
    %d
    ",as);
        return 0;
    }
    View Code

     

  • 相关阅读:
    Oracle 导入导出报错的简单处理
    Windows 下面 winrar 压缩简单记录
    zip 与 unzip的简单使用
    [知乎]山东:一枚神奇独一的“三棱锥”
    【喷嚏图卦】 委内瑞拉崩溃的背后:渐行渐近的石油危机
    [互联网]2018年互联网套路简史
    [wiki]陶德曼调停
    [阮一峰]找回密码的功能设计
    sap 最新财报以及云业务转型情况
    debian 7 安装 rz sz lrzsz
  • 原文地址:https://www.cnblogs.com/forward777/p/11413712.html
Copyright © 2011-2022 走看看