P1083 借教室

蒟蒻刚学了线段树的最最最最最嘴醉罪咀基本的东西,看什么题都想用线段树c++

题目连接

P1083 借教室ui

思路

若是不会线段树请点这里spa

题目中说的是求第一个不知足的申请人code

咱们能够把借教室的操做当作线段树的区间修改,把要借的教室数量$d$当作修改的值的相反数,而后咱们记录一下区间的最小值就好了,若是进行区间修改操做后,最小值已经小于0就能够输出了htm

代码

#prag\
ma GCC optimize("Ofast")//请忽略这里
#include<bits/stdc++.h>
using namespace std;
#define int long long int
inline int read() {
    char c = getchar();
    int x = 0, f = 1;
    while(c < '0' || c > '9') {
        if(c == '-') f = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x * f;
}
const int N=1000005;
int n,m,a[N];
int minn[N*4],lazy[N*4];
void pushup(int root) {
    int lson=root<<1;
    int rson=root<<1|1;
    minn[root]=min(minn[lson],minn[rson]);
}
void build(int root,int l,int r) {//建树 
    int lson=root<<1;
    int rson=root<<1|1;
    if(l==r) {
        minn[root]=a[l];
        return ;
    }
    int mid=(l+r)/2;
    build(lson,l,mid);
    build(rson,mid+1,r);
    pushup(root);
}
void pushdown(int root) {//下放懒标记 
    int lson=root<<1;
    int rson=root<<1|1;
    if(lazy[root]) {
        minn[lson]+=lazy[root];
        minn[rson]+=lazy[root];
        lazy[lson]+=lazy[root];
        lazy[rson]+=lazy[root];
        lazy[root]=0;//懒标记必定要清空啊! 
    }
}
void update(int root,int l,int r,int x,int y,int v) {
    int lson=root<<1;
    int rson=root<<1|1;
    if(x<=l&&r<=y) {
        minn[root]+=v;
        lazy[root]+=v;
        return ;
    }
    int mid=(l+r)>>1;
    pushdown(root);
    if(x<=mid) update(lson,l,mid,x,y,v);
    if(y>mid) update(rson,mid+1,r,x,y,v);
    pushup(root);
}
signed main() {
    n=read();
    m=read();
    for(int i=1; i<=n; ++i) a[i]=read();
    build(1,1,n);
    for(int i=1; i<=m; ++i) {
        int d,s,t;
        cin>>d>>s>>t;
        update(1,1,n,s,t,-d);
        if(minn[1]<0) {//不能知足请求 
            printf("-1\n%d",i);
            return 0;
        }
    }
    cout<<0;
    return 0;
}
相关文章
相关标签/搜索