线段树区间加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; }