POJ2528
题解:参考poj2777,完全一样的思路。只不过这一题需要离散化。
代码:
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
int const N = 10000 + 10;
int n,vis[N],a[N],b[N];
vector<int>v;
struct Node
{
int l,r,col,lazy;
void updata(int val){
col = lazy = val;
}
}node[N<<3];
void build(int id,int l,int r){
node[id].l = l,node[id].r = r;
node[id].lazy = node[id].col = 0;
if(l == r) return;
else{
int mid = (l + r) >> 1;
build(id<<1,l,mid);
build(id<<1|1,mid+1,r);
}
}
void push_down(int id){
int val = node[id].lazy;
if(val){
node[id<<1].updata(val);
node[id<<1|1].updata(val);
node[id].lazy = 0;
}
}
void push_up(int id){
if(node[id<<1].col == -1 || node[id<<1|1].col == -1)
node[id].col = -1;
else if(node[id<<1].col != node[id<<1|1].col)
node[id].col = -1;
else node[id].col = node[id<<1].col;
}
void updata(int id,int L,int R,int k){
int l = node[id].l, r = node[id].r;
if(L <= l && r <= R){
node[id].updata(k);
return;
}
push_down(id);
int mid = (l + r) >> 1;
if(L <= mid) updata(id<<1,L,R,k);
if(mid < R) updata(id<<1|1,L,R,k);
push_up(id);
}
void query(int id,int L,int R){
int l = node[id].l,r = node[id].r;
if(node[id].col > 0){
vis[node[id].col] = 1;
return;
}
push_down(id);
int mid = (l + r) > 1;
if(L <= mid) query(id<<1,L,R);
if(mid < R) query(id<<1|1,L,R);
}
void Init(){
scanf("%d",&n);
v.clear();
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i],&b[i]);
v.push_back(a[i]);
v.push_back(b[i]);
}
sort(v.begin(),v.end());
v.erase(unique(v.begin(),v.end()),v.end());
memset(vis,0,sizeof(vis));
}
int main(){
int c;
scanf("%d",&c);
while(c--){
Init();
build(1,1,v.size());
for(int i=1;i<=n;i++){
int l = lower_bound(v.begin(),v.end(),a[i]) - v.begin() + 1;
int r = lower_bound(v.begin(),v.end(),b[i]) - v.begin() + 1;
updata(1,l,r,i);
}
query(1,1,v.size());
int ans = 0;
for(int i=1;i<=n;i++)
if(vis[i]) ans++;
printf("%d\n",ans);
}
return 0;
}