//#if 0
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <math.h>
#include <string>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <time.h>
#include <set>
#include <list>
#include <iostream>
#define ll long long
#define ull unsigned long long
#define cls(x) memset(x,0,sizeof(x))
#define clslow(x) memset(x,-1,sizeof(x))
#define INF 0x3f3f3f3f
//typedef long long ll;
using namespace std;
const int maxn=2e4+100;
const int mod=1e9+7;
//a是存离散化数字的数组,就是存海报左右区间中出现过的数字,tot就是通用的存a个数的变量
//lazy就是通用的懒惰标记数组
//vis就是最后求取总区间内出现过多少不同数字时防止重复计算的标记
//count就是答案
//这里要注意maxn,给一万个询问,就是会出现两万个数字,a最坏存4万个,lazy一般是a的4倍,vis只要两万
int a[maxn<<1],lazy[maxn<<3],tot=1,vis[maxn],Count=0;
struct nn
{
int l,r;
}p[maxn];
//下推标记数组,以-1为空标记
void Push_down(int rt)
{
if(lazy[rt]!=-1){
lazy[rt<<1]=lazy[rt];
lazy[rt<<1|1]=lazy[rt];
lazy[rt]=-1;
}
}
void Update(int L,int R,int l,int r,int rt,int C)
{
if(L<=l && r<=R)
{
lazy[rt]=C;
return;
}
int mid=(r+l)>>1;
Push_down(rt);
if(L<=mid)Update(L,R,l,mid,rt<<1,C);
if(R>mid)Update(L,R,mid+1,r,rt<<1|1,C);
}
void Query(int L,int R,int l,int r,int rt)
{
if(L<=l && r<=R && lazy[rt] != -1 )
{
if(vis[ lazy[rt] ] == 0)
vis[ lazy[rt] ] = 1,
Count++;
return ;
}
if(l==r)return;//询问里面要千万注意这里,一定要写,不然re,当l==r说明查询到结尾却没有碰到
//lazy不是-1的,说明这是两个海报之间的空隙部分,不写就一直死循环
int mid=(l+r)>>1;
// Push_down(rt);
if(L<=mid)Query(L,R,l,mid,rt<<1);
if(R>mid)Query(L,R,mid+1,r,rt<<1|1);
}
int main()
{
// freopen("in.txt", "r", stdin);
int t;
scanf("%d",&t);
while(t--){
memset(vis,0,sizeof vis);
memset(lazy,-1,sizeof lazy);
Count=0;
tot=1;
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&p[i].l,&p[i].r);
a[tot++]=p[i].l;
a[tot++]=p[i].r;
}
sort(a+1,a+tot);
tot=unique(a+1,a+tot)-a;//防止有重复数据干扰
int k=tot;
for(int i=2;i<k;i++){
if(a[i]-a[i-1]>1)a[tot++]=a[i-1]+1;//这里就是离散的补充
}
sort(a+1,a+tot);
for(int i=1;i<=n;i++){
int l,r;
l=lower_bound(a+1,a+tot,p[i].l)-a;
r=lower_bound(a+1,a+tot,p[i].r)-a;
Update(l,r,1,tot-1,1,i);
}
// cout<<lazy[1]<<endl;
Query(1,tot-1,1,tot-1,1);
cout<<Count<<endl;
}
return 0;
}
POJ - 2528(线段树+离散化)详解
最新推荐文章于 2023-06-21 14:19:30 发布