题意:给出n朵花的在[s,t] 时间里开花,进行m次询问,每次给出时间t,问在这个时间开几朵花。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4325
思路:区间更新,单点查询,但是数据很大,需要离散化,
小学了一下unique, 这里需要把所有的数据都读入才可以处理
不过和线段树的离线的处理相比,这道题还是很给力的~~~
#include <iostream>
#include <stdio.h>
#include <map>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define maxn 100010
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int n,m;
map <int ,int > mp;
int sum[maxn<<2];
int col[maxn<<2];
int s[maxn],t[maxn],q[maxn];
int time[maxn<<2];
void PushDown(int rt){
if(col[rt]){
col[rt<<1] += col[rt];
col[rt<<1|1] += col[rt];
sum[rt<<1] += col[rt] ;
sum[rt<<1|1] += col[rt] ;
col[rt] = 0;
}
}
void build(int l,int r,int rt){
sum[rt] = 0;
col[rt] = 0;
if(l == r) return;
int m = (l + r)/2;
build(lson);
build(rson);
}
void update(int L,int R,int l,int r,int rt){
if(L <= l && r <= R) {
col[rt] += 1;
sum[rt] += 1;
return ;
}
PushDown(rt);
int m = (l + r)/2;
if(L <= m) update(L,R,lson);
if(m < R) update(L,R,rson);
}
int query(int pos,int l,int r,int rt){
if(l == r)
return sum[rt];
int m = (l + r)/2;
PushDown(rt);
if(pos <= m) query(pos,lson);
else query(pos,rson);
}
int main()
{
int T,ncase=1;
scanf("%d",&T);
while(T--){
scanf("%d %d",&n,&m);
int T=0;
for(int i=1;i<=n;i++){
scanf("%d %d",&s[i],&t[i]);
time[T++] = s[i];
time[T++] = t[i];
}
for(int i=1;i<=m;i++){
scanf("%d",&q[i]);
time[T++] = q[i];
}
mp.clear();
sort(time,time+T);
int cnt = unique(time,time + T) - time;
for(int i=0;i<cnt;i++)
mp[time[i]] = i+1;
build(1,cnt,1);
for(int i=1;i<=n;i++)
update(mp[s[i]],mp[t[i]],1,cnt,1);
printf("Case #%d:\n",ncase++);
for(int i=1;i<=m;i++)
printf("%d\n",query(mp[q[i]],1,cnt,1));
}
return 0;
}