基本线段树操作。
先离散化,然后再进行更新,最后从下至上更新一遍树,输出根节点即可
#include <stdio.h>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
map<int,int>mp;
#define maxn 100100
int tree[maxn<<2];
struct node
{
int l,r;
}line[maxn];
int que[maxn<<1];
void creat(int l,int r,int rt)
{
tree[rt]=0;
if(l==r) return;
int mid=(l+r)>>1;
creat(l,mid,rt<<1);
creat(mid+1,r,rt<<1|1);
}
void down(int l,int r,int rt)
{
if(l==r)
{
tree[rt]++;
return;
}
int mid=(l+r)/2;
down(l,mid,rt<<1);
down(mid+1,r,rt<<1|1);
tree[rt]=max(tree[rt],max(tree[rt<<1],tree[rt<<1|1]));
}
void update(int ll,int rr,int l,int r,int rt)
{
if(ll==l&&rr==r)
{
tree[rt]++;
// down(ll,rr,rt);
return;
}
int mid=(l+r)/2;
if(rr<=mid) update(ll,rr,l,mid,rt<<1);
else if(ll>mid) update(ll,rr,mid+1,r,rt<<1|1);
else update(ll,mid,l,mid,rt<<1),update(mid+1,rr,mid+1,r,rt<<1|1);
// tree[rt]=tree[rt]+max(tree[rt<<1],tree[rt<<1|1]);
}
void last(int l,int r,int rt)
{
if(l==r)
{
return;
}
int mid=(l+r)/2;
last(l,mid,rt<<1);
last(mid+1,r,rt<<1|1);
tree[rt]+=max(tree[rt<<1],tree[rt<<1|1]);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
int i,j,k;
for(i=0;i<n;i++)
{
scanf("%d%d",&line[i].l,&line[i].r);
que[i*2]=line[i].l,que[i*2+1]=line[i].r;
}
sort(que,que+2*n);
int top=unique(que,que+2*n)-que;
for(i=0;i<top;i++)
{
mp[que[i]]=i;
}
creat(0,top-1,1);
for(i=0;i<n;i++)
{
line[i].l=mp[line[i].l];
line[i].r=mp[line[i].r];
// cout<<"**"<<line[i].l<<"**"<<line[i].r<<endl;
update(line[i].l,line[i].r,0,top-1,1);
}
last(0,top-1,1);
printf("%d\n",tree[1]);
}
return 0;
}