题解 | #[NOIP2012]借教室#

[NOIP2012]借教室

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

二分+差分即可; AC代码+注释如下:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
struct node{//结构体
    int d,s,t;
}a[N];
int n,m,b[N],c[N];

bool check(int x){//二分搜索
    for(int i=1;i<=n;i++)c[i]=0;//初始化
    for(int i=1;i<=x;i++){//差分
        c[a[i].s]+=a[i].d;
        c[a[i].t+1]-=a[i].d;
    }
    int t=0;
    for(int i=1;i<=n;i++){
        t+=c[i];//差分前缀和
        if(b[i]-t<0)return true;//判断是否满足矛盾
    }
    return false;
}

int main(){
    cin>>n>>m;//输入
    for(int i=1;i<=n;i++)cin>>b[i];
    for(int i=1;i<=m;i++)cin>>a[i].d>>a[i].s>>a[i].t;
    int l=1,r=m,ans=0;
    while(l<=r){//二分
        int mid=(l+r)>>1;
        if(check(mid))ans=mid,r=mid-1;
        else l=mid+1;
    }
    if(ans)cout<<-1<<'\n'<<ans<<'\n';
    else cout<<ans<<'\n';//输出
}
全部评论

相关推荐

10-19 00:20
已编辑
门头沟学院 机械设计/制造
庆玲汽车(集团)有限公司 整车研发岗 年薪11W-13W
点赞 评论 收藏
分享
FFFcaptain328:入职即送东南亚腰子之旅👿
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
10-15 14:22
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务