【NOIP2012 提高组】借教室

题目

https://www.luogu.org/problemnew/show/P1083

思路

差分数组练习题

首先看清题目,题目是问第几个人要改订单,而不是有几个人要改订单。

所以我们自然想到二分订单数。

每一次判断处理一次差分数组,再判断是否有足够教室即可。

代码

#include
#include
#include
using namespace std;
const int maxn=1e6+77;
struct C
{
    int d,l,r;
}c[maxn];
int a[maxn],s[maxn],n,m;
bool check(int x)
{
    memset(s,0,sizeof(s));
    for(int i=1; i<=x; i++) s[c[i].l]+=c[i].d,s[c[i].r+1]-=c[i].d;
    int p=0;
    for(int i=1; i<=n; i++)
    {
        p+=s[i];
        if(p>a[i]) return 0;
    }
    return 1;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++) scanf("%d",&a[i]);
    for(int i=1; i<=m; i++) scanf("%d%d%d",&c[i].d,&c[i].l,&c[i].r);
    int l=0,r=m;
    while(l<=r)
    {
        int mid=(l+r)>>1;
        if(check(mid)) l=mid+1;else r=mid-1;
    }
    if(m!=r)
    {
        printf("-1\n%d",r+1);
    }else printf("0");
}

你可能感兴趣的:(题解,二分,差分数组)