题意:
一块黑板 给你贴广告。。。后面贴的会把前面贴的给覆盖了(如果在同一个地方),
然后最后要你求还有多少广告是能被看到的。。 能被看到任何一点都算能看到。。。
这题难点也在于数据太大。。无法直接用暴力去做。。
所以要用到离散。。。。。
每一个广告有2个端点。他最多有1W个广告。。。也就是说他最多只有2W个端点。
所以我们可以把他给的所有广告的端点来一个排序。 然后重新给他们定义值。
这样就可以用一个2*N的线段树来解决了= =
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int m;
int a[80000];
struct tree{
int left;
int right;
int lazy;
}tree[80000];
struct shuzu{
int zhi;
int xuhao;
}b[50005];
bool cmp(shuzu s,shuzu d)
{
return s.zhi<d.zhi;
}
void inset(int inst,int le,int ri)
{
tree[inst].left=le;
tree[inst].right=ri;
tree[inst].lazy=0;
if(le==ri) return ;
int mid=(le+ri)>>1;
inset(2*inst,le,mid);
inset(2*inst+1,mid+1,ri);
}
void lazy(int inst,int k)
{
if(tree[inst].left==tree[inst].right) return ;
tree[inst].lazy=0;
tree[2*inst].lazy=k;
tree[2*inst+1].lazy=k;
}
void query(int inst,int le,int ri,int k)
{
if(tree[inst].left==le&&tree[inst].right==ri)
{
tree[inst].lazy=k;
return ;
}
if(tree[inst].lazy!=0)
lazy(inst,tree[inst].lazy);
int mid=(tree[inst].left+tree[inst].right)>>1;
if(ri<=mid)
query(2*inst,le,ri,k);
else if(le>mid)
query(2*inst+1,le,ri,k);
else
{
query(2*inst,le,mid,k);
query(2*inst+1,mid+1,ri,k);
}
}
void tj(int inst)
{
if(tree[inst].lazy!=0)
{
//cout<<tree[inst].left<<" "<<tree[inst].right<<" "<<tree[inst].lazy<<endl;
a[m]=tree[inst].lazy;
m++;
return ;
}
if(tree[inst].left==tree[inst].right) return ;
tj(2*inst);
tj(2*inst+1);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int i[20005],j[20005];
for(int o=0;o<n;o++)
{scanf("%d%d",&i[o],&j[o]);
b[o].zhi=i[o];
b[o+n].zhi=j[o];
b[o].xuhao=o;
b[o+n].xuhao=o+n;
}
sort(b,b+2*n,cmp);
/*for(int o=0;o<2*n;o++)
cout<<b[o].xuhao<<" "<<b[o].zhi<<endl;*/
int k1=1;
if(b[0].xuhao<n)
i[b[0].xuhao]=1;
else
j[b[0].xuhao-n]=1;
int n1=1;
for(int o=1;o<2*n;o++)
{
if(b[o].zhi!=b[o-1].zhi)
{ k1++;
if(b[o].xuhao<n)
i[b[o].xuhao]=k1;
else
j[b[o].xuhao-n]=k1;
}
else {
if(b[o].xuhao<n)
i[b[o].xuhao]=k1;
else
j[b[o].xuhao-n]=k1;
}
// if(b[o].xuhao<n)
// cout<<b[o].xuhao<<" "<<i[b[o].xuhao]<<" "<<'i'<<endl;
// else
// cout<<b[o].xuhao-n<<" "<<j[b[o].xuhao-n]<<" "<<'j'<<endl;
if(o==2*n-1)
{
if(b[o].xuhao<n)
n1=i[b[o].xuhao];
else
n1=j[b[o].xuhao-n];
}
}
//cout<<n1<<endl;
inset(1,1,n1);
for(int o=0;o<n;o++)
//cout<<i[o]<<" "<<j[o]<<endl;
query(1,i[o],j[o],o+1);
m=0;
tj(1);
sort(a,a+m);
int k=1;
if(n==0)
k=0;
for(int o=1;o<m;o++)
{
// cout<<a[o]<<" ";
if(a[o]!=a[o-1])
k++;
}
printf("%d\n",k);
}
}