POJ 2528
这题和上题一样,但要注意,这题专业反人类反STL,用map离散化TLE。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string.h>
#include <queue>
#include <cmath>
#include <map>
#include <vector>
#define LL __int64
using namespace std;
const int N=40050;
const int root=1;
int tree[N*4];
struct Paper{
int begin,end;
}paper[N/3];
int sort_num[N],cnt;
bool hash[N/3];
void PushDown(int now){
if(tree[now]>0){
tree[now*2]=tree[now*2+1]=tree[now];
tree[now]=0;
}
}
void update(int now,int l,int r,int u,int L,int R){
if(l<=L&&r>=R){
tree[now]=u;
return ;
}
PushDown(now);
int m=(L+R)/2;
if(r<=m){
update(now*2,l,r,u,L,m);
}
else if(l>=m+1)update(now*2+1,l,r,u,m+1,R);
else{
update(now*2,l,r,u,L,m);
update(now*2+1,l,r,u,m+1,R);
}
}
void query(int now,int l,int r){
if(tree[now]>0){
if(!hash[tree[now]]) cnt++;
hash[tree[now]]=true;
return ;
}
if(l==r) return ;
int m=(l+r)/2;
query(now*2,l,m);
query(now*2+1,m+1,r);
}
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;
if (X[m] < key) l = m + 1;
else r = m - 1;
}
return -1;
}
int main(){
int T,n,tot,l,r;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
tot=0;
for(int i=1;i<=n;i++){
scanf("%d%d",&paper[i].begin,&paper[i].end);
sort_num[tot++]=paper[i].begin;
sort_num[tot++]=paper[i].end;
}
sort(sort_num,sort_num+tot);
int cnum=1,m=0;
for(int i=0;i<tot;i++){
if(i==0||sort_num[i]!=sort_num[i-1]){
sort_num[m++]=sort_num[i];
}
}
for (int i = m - 1 ; i > 0 ; i --) {
if (sort_num[i] != sort_num[i-1] + 1) sort_num[m ++] = sort_num[i-1] + 1;
}
sort(sort_num,sort_num+m);
memset(tree,0,sizeof(tree));
for(int i=1;i<=n;i++){
l=Bin(paper[i].begin , m , sort_num),r=Bin(paper[i].end , m , sort_num);
l++,r++;
update(root,l,r,i,1,m);
}
memset(hash,false,sizeof(hash));
cnt=0;
query(root,1,m);
printf("%d\n",cnt);
}
return 0;
}

浙公网安备 33010602011771号