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;
}
相關文章
相關標籤/搜索