[NOIP2012]借教室

比换教室不知道低到哪里去了。

就二分一下第一个不满足的人,然后维护一个差分数组,diff[s[i]]+=d[i],diff[t[i]+1]-=d[i],然后把diff加起来,判断一下是否rest<现在的即可。

时间复杂度nlogn,就水过了。。。

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=1000005;
int n,rest[N],d[N],s[N],t[N],dif[N],m;
bool ck(int x) {
    memset(dif,0,sizeof dif);
    for(int i=1;i<=x;i++) dif[s[i]]+=d[i],dif[t[i]+1]-=d[i];
    for(int i=1;i<=n;i++) dif[i]+=dif[i-1];
    for(int i=1;i<=n;i++) if(dif[i]>rest[i]) return 0;
    return 1;
}
int main() {
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&rest[i]);
    for(int i=1;i<=m;i++) scanf("%d%d%d",&d[i],&s[i],&t[i]);
    if(ck(m)){puts("0");return 0;}
    int l=1,r=m,ans=0;
    while(l<r) {
        int mid=l+r>>1;
        if(ck(mid)) {ans=mid+1,l=mid+1;}
        else r=mid;
    }
    cout<<"-1\n"<<l<<endl;
}
借教室

 

posted @ 2018-09-18 17:30  SWHsz  阅读(144)  评论(0编辑  收藏  举报