ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

$Noip2012/Luogu1083$ 借教室

2019-10-03 15:04:47  阅读:313  来源: 互联网

标签:Noip2012 Luogu1083 read 教室 借完 int Rg include define


$Luogu$

 

$Sol$

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

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

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

$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\n");
    else printf("-1\n%d\n",as);
    return 0;
}
View Code

 

 

 

标签:Noip2012,Luogu1083,read,教室,借完,int,Rg,include,define
来源: https://www.cnblogs.com/forward777/p/11413712.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有