题意:市长选举,在一块可以视为宽为1的矩形中贴自己的海报,后贴的海报会覆盖之前的海报,问贴完之后能看到多少块海报。
思路:留意到这个矩形的最大长度可以去到100000000,而n最多为10000,所以可以离散化一下,然后区间set开搞就可以了
Trick:这里的数组要开大一点,不然会迷之RE
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
#define lson i*2,l,m
#define rson i*2+1,m+1,r
const int maxn = 100000+100;
int setv[maxn*4];
int vis[maxn*4];
int num;
void PushDown(int i)
{
if (setv[i]!=-1)
{
setv[i*2]=setv[i*2+1]=setv[i];
setv[i]=-1;
}
}
void update(int ql,int qr,int v,int i,int l,int r)
{
if (ql<=l && qr>=r)
{
setv[i]=v;
return;
}
PushDown(i);
int m = (l+r)/2;
if (ql<=m)
update(ql,qr,v,lson);
if (m<qr)
update(ql,qr,v,rson);
}
void query(int i,int l,int r)
{
if (setv[i]!=-1)
{
if (!vis[setv[i]])
num++;
vis[setv[i]]=1;
return;
}
if (l==r)
return;
int m = (l+r)/2;
query(lson);
query(rson);
}
struct Node
{
int l,r;
}node[maxn];
int b[maxn];
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
int n;
scanf("%d",&n);
int k = 1;
memset(setv,-1,sizeof(setv));
for (int i = 1;i<=n;i++)
{
scanf("%d%d",&node[i].l,&node[i].r);
b[k++]=node[i].l;
b[k++]=node[i].r;
}
sort(b+1,b+k);
int size = unique(b+1,b+k)-(b+1);
for (int i = 1;i<=n;i++)
{
node[i].l=upper_bound(b+1,b+1+size,node[i].l)-b-1;
node[i].r=upper_bound(b+1,b+1+size,node[i].r)-b-1;
// printf("%d %d\n",node[i].l,node[i].r);
update(node[i].l,node[i].r,i,1,1,size);
}
num=0;
memset(vis,0,sizeof(vis));
query(1,1,size);
printf("%d\n",num);
}
}