#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#define LL long long
#define lson l , m , rt<<1
#define rson m+1 , r, rt<<1|1
using namespace std;
const int maxn = 11111;
int X[maxn<<2];
int li[maxn],ri[maxn];
int hash[maxn];
int col[maxn<<4];
int ans;
void pushdown(int rt)
{
if(col[rt] != -1)
{
col[rt<<1] = col[rt<<1|1] = col[rt];
col[rt] = -1;
}
}
void update(int L,int R,int c,int l,int r,int rt)
{
if(L <= l && r <= R)
{
col[rt] = c;
return ;
}
pushdown(rt);
int m = (l + r) >> 1;
if(L <= m) update(L,R,c,lson);
if(R > m) update(L,R,c,rson);
}
void query(int l,int r,int rt)
{
if(col[rt] != -1)
{
if(!hash[col[rt]]) ans++;
hash[col[rt]] = 1;
return ;
}
if(l == r) return ;
int m = (l + r) >> 1;
query(lson);
query(rson);
}
int Bin(int key,int n,int X[])
{
int l = 0 , r = n - 1;
while(l <= r)
{
int m = (l + r) >> 1;
if(X[m] == key) return m;
else if(X[m] > key) r = m - 1;
else l = m + 1;
}
return -1;
}
int main()
{
int T , N;
scanf("%d",&T);
while(T--)
{
scanf("%d",&N);
int nn = 0;
for(int i=1;i<=N;i++)
{
scanf("%d%d",&li[i],&ri[i]);
X[nn++] = li[i];
X[nn++] = ri[i];
}
sort(X,X+nn);
int m = 1;
for(int i=1;i<nn;i++)
{
if(X[i] != X[i-1]) X[m++] = X[i];
}
sort(X,X+m);
memset(col,-1,sizeof(col));
for(int i=1;i<=N;i++)
{
int l = Bin(li[i],m,X);
int r = Bin(ri[i],m,X);
update(l,r,i,0,m,1);
}
memset(hash,0,sizeof(hash));
ans = 0;
query(0,m,1);
printf("%d\n",ans);
}
return 0;
}
POJ 2528 Mayor's posters (线段树,扫描线)
最新推荐文章于 2019-04-28 21:44:48 发布