LGOJ P1083 借教室

LGOJ P1083 借教室

問題の解

线段树模板往上一打……T了一个点……不过o2可以AC……

问题是在比赛中我感觉我会懒得手打线段树……

セグメント ツリー コード:

#include<bits/stdc++.h>
#define ll long long 
#define mid ((L+R)>>1)
#define ls (o<<1)
#define rs ((o<<1)+1)
#define len (R-L+1)
using namespace std;
inline int read()
{
    char c=getchar();int  x=0;
    for(;!isdigit(c);c=getchar());
    for(;isdigit(c);c=getchar())
        x=x*10+c-'0';
    return x;
}
const int N=1e6+5;
const ll INF=0x3f3f3f3f3f3f3f3f;
int n,m,pre_r[N];
ll l, r, dlt;
ll a[N], mini[N << 1], tag[N << 1];

inline void push_up(ll o)
{
    mini[o]=min(mini[ls],mini[rs]);
}

void construct(ll o, ll L, ll R)
{
    tag[o] = 0;
    if (L == R)
    {
        mini[o]=a[L];
        return;
    }
    construct(ls, L, mid);
    construct(rs, mid + 1, R);
    push_up(o);
}

inline void ff(ll o, ll L, ll R,ll d)
{
    tag[o] += d;
    mini[o]+=d;
}

inline void push_down(ll o, ll L, ll R)
{
    ff(ls, L, mid,tag[o]);
    ff(rs, mid + 1, R,tag[o]);
    tag[o] = 0;
}

void update(ll o, ll L, ll R)
{
    if (l <= L && R <= r)
    {
        tag[o] += dlt;
        mini[o]+=dlt;
        return;
    }
    push_down(o, L, R);
    if (l <= mid)update(ls, L, mid);
    if (r > mid)update(rs, mid + 1, R);
    push_up(o);
}

ll query(ll o, ll L, ll R)
{
    if (l <= L && R <= r)
    {
        return mini[o];
    }
    ll res = INF;
    push_down(o, L, R);
    if (l <= mid)
        res=min(res,query(ls, L, mid));
    if (r > mid)
        res=min(res,query(rs, mid + 1, R));
    push_up(o);
    return res;
}


int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)a[i]=read();
    construct(1,1,n);
    bool flag=0;
    for(int i=1;i<=m;i++)
    {
        ll d=read();
        l=read();
        r=read();
        ll cur_mini=query(1,1,n);
        if(cur_mini<d)
        {
            cout<<"-1"<<endl<<i;
            flag=1;
            break;
        }
        dlt=-d;
        update(1,1,n);
    }
    if(flag==0)cout<<0;

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/kion/p/11824816.html