zoukankan      html  css  js  c++  java
  • [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
    "<<l<<endl;
    }
    借教室
    我是咸鱼。转载博客请征得博主同意Orz
  • 相关阅读:
    【Intellij Idea】设置JDK
    MarkDown换行
    Git 查看/修改用户名、邮箱
    JavaScript对象
    Javascript事件
    第十次会议
    第九次会议
    详细设计文档
    第八次会议
    第七次会议
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9670227.html
Copyright © 2011-2022 走看看