题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4325
【题意】
有
n
n
n 朵花,已经给出每朵花的开花时间
[
s
i
,
e
i
]
[s_i, e_i]
[si,ei],现在有
m
m
m 次查询,对查询值
x
x
x,输出在时间点
x
x
x 开花的个数(
n
,
m
<
=
1
0
5
,
s
i
,
e
i
<
=
1
0
9
n,m<=10^5,s_i,e_i<=10^9
n,m<=105,si,ei<=109)
【思路】
将区间点和查询点离散化,然后线段树区间更新,单点求和即可
#include<bits/stdc++.h>
#define node tree[id]
#define lson tree[id<<1]
#define rson tree[id<<1|1]
using namespace std;
const int maxn=100005;
struct Tree{
int left,right;
int lazy;
}tree[maxn<<3];
int n,m;
int x[maxn],y[maxn],q[maxn];
vector<int> p;
void pushdown(int id){
if(node.lazy && node.left!=node.right){
lson.lazy+=node.lazy;
rson.lazy+=node.lazy;
node.lazy=0;
}
}
void build(int id,int le,int ri){
node.left=le;
node.right=ri;
node.lazy=0;
if(le==ri) return;
int mid=(le+ri)>>1;
build(id<<1,le,mid);
build(id<<1|1,mid+1,ri);
}
void update(int id,int le,int ri){
if(node.left==le && node.right==ri){
node.lazy+=1;
return;
}
pushdown(id);
int mid=(node.left+node.right)>>1;
if(ri<=mid) update(id<<1,le,ri);
else if(le>mid) update(id<<1|1,le,ri);
else{
update(id<<1,le,mid);
update(id<<1|1,mid+1,ri);
}
}
int query(int id,int pos){
if(node.left==node.right){
return node.lazy;
}
pushdown(id);
int mid=(node.left+node.right)>>1;
if(pos<=mid) return query(id<<1,pos);
else return query(id<<1|1,pos);
}
int main(){
int T;
scanf("%d",&T);
for(int kase=1;kase<=T;++kase){
scanf("%d%d",&n,&m);
p.clear();
for(int i=0;i<n;++i){
scanf("%d%d",&x[i],&y[i]);
p.push_back(x[i]);
p.push_back(y[i]);
}
for(int i=0;i<m;++i){
scanf("%d",&q[i]);
p.push_back(q[i]);
}
sort(p.begin(),p.end());
p.erase(unique(p.begin(),p.end()),p.end());
build(1,0,p.size()-1);
for(int i=0;i<n;++i){
int le=lower_bound(p.begin(),p.end(),x[i])-p.begin();
int ri=lower_bound(p.begin(),p.end(),y[i])-p.begin();
update(1,le,ri);
}
printf("Case #%d:\n",kase);
for(int i=0;i<m;++i){
int a=lower_bound(p.begin(),p.end(),q[i])-p.begin();
printf("%d\n",query(1,a));
}
}
return 0;
}