您的位置:首页 > 其它

BZOJ 1651 专用牛棚

2016-04-29 18:38 309 查看
线段树区间加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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: