RT, 悬赏1关注,样例输入得7(两个都是(悲
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+10;
const int INF = 0x7fffffff;
int n,T;
struct node{
int l,r,mx,lz;
}tree[MAXN << 2];
void lazy(int k)
{
tree[k].mx += 1;
}
void pushdown(int k)
{
lazy(2 * k);
lazy(2 * k + 1);
}
void build(int k,int l,int r)
{
tree[k].l = l;
tree[k].r = r;
tree[k].lz = -1;
if(l == r)
{
tree[k].mx = 0;
return;
}
int mid,lc,rc;
mid = (l + r) / 2; // 划分点
lc = k * 2; // 左孩子存储下标
rc = k * 2 + 1; // 右孩子存储下标
build(lc,l,mid);
build(rc,mid + 1,r);
tree[k].mx = max(tree[lc].mx,tree[rc].mx);
}
void update(int k,int l,int r)//将a[i]改为v
{
if(tree[k].l >= l && tree[k].r <= r)
return lazy(k);
pushdown(k);
int mid,lc,rc;
mid = (tree[k].l + tree[k].r) / 2;
lc = k * 2;
rc = k * 2 + 1;
if(l <= mid)
update(lc,l,mid);
if(r > mid)
update(rc,mid + 1,r);
tree[k].mx = max(tree[lc].mx,tree[rc].mx);
}
int query(int k,int l,int r)// 求区间[l,r]的最值
{
if(tree[k].l >= l && tree[k].r <= r)
return tree[k].mx;
pushdown(k);
int mid,lc,rc;
mid = (tree[k].l + tree[k].r) / 2;//划分点
lc = k * 2; // 左孩子存储下标
rc = k * 2 + 1; // 右孩子存储下标
int Max = -INF;
if(l <= mid)
Max = max(Max,query(lc,l,mid));
if(r > mid)
Max = max(Max,query(rc,mid + 1,r));
return Max;
}
int main()
{
scanf("%d",&T);
for(int i = 1;i <= T;i++)
{
scanf("%d",&n);
int newl[MAXN],newr[MAXN];
int tmp[MAXN * 2],cnt = 0,maxr = -1;
for(int i = 0;i < n;i++)
{
scanf("%d%d",&newl[i],&newr[i]);
tmp[cnt++] = newl[i];
tmp[cnt++] = newr[i];
maxr = max(newl[i],max(newr[i],maxr));
}
sort(tmp,tmp+cnt);
//cnt = unique(olda+1,olda+1+cnt)-olda-1;
for(int i = 0;i < n;i++)
{
newl[i] = lower_bound(tmp,tmp+cnt,newl[i]) - tmp + 1;
newr[i] = lower_bound(tmp,tmp+cnt,newr[i]) - tmp + 1;
maxr = max(newl[i],max(newr[i],maxr));
}
build(1,1,maxr);
for(int i = 0;i < n;i++)
{
update(1,newl[i],newr[i]);
}
printf("%d\n",query(1,1,n));
}
return 0;
}