luoguP1083 借教室(题解)(我用的线段树)

Posted eternal风度

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luoguP1083 借教室(题解)(我用的线段树)相关的知识,希望对你有一定的参考价值。

luoguP1083 借教室 题目

#include<cstdio>
#include<iostream>
#include<cmath>
#include<string>
#include<string>
#include<algorithm>
#define rg register
#define N 1000050
#define lc now<<1
#define rc (now<<1)+1
using namespace std;

int n,m;
bool flag;
int a[N];
struct tree{
    int l,r,minn,lazy;
}ljl[N<<2];

inline int read()
{
    int s=0,m=1;char ch=getchar();
    while(ch!=-&&(ch<0||ch>9))ch=getchar();
    if(ch==-)m=-1,ch=getchar();
    while(ch>=0&&ch<=9)s=(s<<3)+(s<<1)+ch-0,ch=getchar();
    return s*m;
}

void build(int now,int ll,int rr)
{
    if(ll==rr)
        {
            ljl[now].l=ljl[now].r=ll;
            ljl[now].minn=a[ll];
        }
    else
        {
            int mid=(ll+rr)>>1;
            build(lc,ll,mid);
            build(rc,mid+1,rr);
            ljl[now].l=ll;ljl[now].r=rr;
            ljl[now].minn=min(ljl[lc].minn,ljl[rc].minn);
        }
}

void push_down(int now)
{
    if(ljl[now].lazy!=0)
        {
            ljl[lc].lazy+=ljl[now].lazy;
            ljl[rc].lazy+=ljl[now].lazy;
            ljl[lc].minn-=ljl[now].lazy;
            ljl[rc].minn-=ljl[now].lazy;
            ljl[now].lazy=0;
        }
}

void xiugai(int now,int ll,int rr,int d)
{
    push_down(now);
    if(ljl[now].l==ll&&ljl[now].r==rr)
        {
            ljl[now].lazy+=d;
            ljl[now].minn-=d;
            //            if(ljl[now].minn<0)flag=1;
        }
    else
        {
            int mid=(ljl[now].l+ljl[now].r)/2;
            if(rr<=mid)xiugai(2*now,ll,rr,d);
            if(ll>mid)xiugai(2*now+1,ll,rr,d);
            if(ll<=mid&&rr>mid)
                {
                    xiugai(2*now,ll,mid,d);
                    xiugai(2*now+1,mid+1,rr,d);
                }
            ljl[now].minn=min(ljl[lc].minn,ljl[rc].minn);
        }
}

int main()
{
    n=read();m=read();
    for(rg int i=1;i<=n;++i)a[i]=read();
    build(1,1,n);
    for(rg int i=1;i<=m;++i)
        {
            rg int num=read(),st=read(),et=read();
            xiugai(1,st,et,num);
            if(ljl[1].minn<0)
                {
                    printf("-1\n%d\n",i);
                    exit(0);
                }
        }
    puts("0");
    return 0;
}

 

以上是关于luoguP1083 借教室(题解)(我用的线段树)的主要内容,如果未能解决你的问题,请参考以下文章

二分查找or线段树(借教室洛谷1083vijos1782NOIP 2012 提高组 第二天 第二题)

luogu P1083 借教室

noip提高组2012 借教室(luogu 1083)

noip2012 借教室 线段树最小值做法

洛谷 P1083 借教室 题解

[NOIP2012提高组]借教室