BZOJ 1651 专用牛棚

Posted on 2016-04-29 18:38  ziliuziliu  阅读(236)  评论(0编辑  收藏  举报

线段树区间加1,求一次全局最大值,开好内存,炸过去。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxv 4000500
#define maxn 100050
using namespace std;
int n,a[maxn],b[maxn],ls[maxv],rs[maxv],lazy[maxv],val[maxv],cnt=0,tot=0,root;
void build(int &now,int left,int right)
{
    now=++tot;
    if (left==right) return;
    int mid=(left+right)>>1;
    build(ls[now],left,mid);
    build(rs[now],mid+1,right); 
}
void pushdown(int now)
{
    if (lazy[now]>0)
    {
        lazy[ls[now]]+=lazy[now];lazy[rs[now]]+=lazy[now];
        val[ls[now]]+=lazy[now];val[rs[now]]+=lazy[now];
        lazy[now]=0;
    }
}
void pushup(int now)
{
    val[now]=max(val[ls[now]],val[rs[now]]);
}
void update(int now,int left,int right,int l,int r)
{
    pushdown(now);
    if ((left==l) && (right==r))
    {
        lazy[now]++;val[now]++;
        return;    
    }
    int mid=(left+right)>>1;
    if (r<=mid) update(ls[now],left,mid,l,r);
    else if (l>=mid+1) update(rs[now],mid+1,right,l,r);
    else
    {
        update(ls[now],left,mid,l,mid);
        update(rs[now],mid+1,right,mid+1,r);
    }
    pushup(now);
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%d%d",&a[i],&b[i]);
        cnt=max(cnt,b[i]);
    }
    build(root,1,cnt);
    for (int i=1;i<=n;i++)
        update(1,1,cnt,a[i],b[i]);
    printf("%d\n",val[root]);
    return 0;
}