题解 | #[NOIP2012]借教室#

[NOIP2012]借教室

https://ac.nowcoder.com/acm/problem/16564

不会写线段树

尝试用二分答案+维护差分数组来解决

对于第x号订单,如果无法满足,则往后的都无法满足

AC代码如下:

#include <bits/stdc++.h>
using namespace std;

const int Nmax = 1e6;
const int Mmax = 1e6;
int n,m;
int r[Nmax+5],d[Mmax+5],s[Mmax+5],t[Mmax+5],delta[Nmax+5];
bool juage(int x){
    for(int i = 1;i <= n;i++)    //维护差分数组
        delta[i] = r[i] - r[i - 1];
    
    for(int i = 1;i <= x;i++){
        delta[s[i]] -= d[i];
        delta[t[i]+1] += d[i];
    }
    for(int i = 1;i <= n;i++){
        delta[i] = delta[i]+delta[i-1];
        if(delta[i] < 0) return true;
    }
    return false;
}

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    cin>>n>>m;
    int L = 1,R = m;
    for(int i = 1;i <= n;i++)
        cin>>r[i];
    for(int i = 1;i <= m;i++)
        cin>>d[i]>>s[i]>>t[i]; 
    
    //二分答案+检验
    while(L <= R){
        int mid = L + (R - L)/2;
        if(juage(mid)) R = mid - 1;
        else L = mid + 1;
    }
    if(R+1 > m) cout<<0;
    else cout<<-1<<'\n'<<R+1;
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
分享
机械打工仔:我来告诉你原因,是因为sobb有在线简历,有些HR为了快会直接先看在线简历,初步感觉不合适就不会找你要详细的了
投了多少份简历才上岸
点赞 评论 收藏
分享
07-02 13:50
闽江学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务