给你N朵花开的区间,然后M个询问,问你这点有多少花开。
因为-1e8<s,e<1e8,所以的离散化。
#include <iostream>
#include <cstring>
#include <map>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N=100003;
int n,m;
struct Node
{
int l,r;
int v;
int ly;
} t[N*4];
int s[N],e[N];
int tim[N*4];
int q[N];
map<int,int>mp;
void built(int l,int r,int f)
{
t[f].l=l;
t[f].r=r;
t[f].v=0;
t[f].ly=0;
if(l==r)return;
int mid=(l+r)/2;
built(l,mid,f<<1);
built(mid+1,r,f<<1|1);
}
void down(int f)
{
if(t[f].ly!=0)
{
t[f<<1].ly+=t[f].ly;
t[f<<1|1].ly+=t[f].ly;
t[f<<1].v+=t[f].ly;
t[f<<1|1].v+=t[f].ly;
t[f].ly=0;
}
}
void update(int l,int r,int f)
{
if(t[f].l==l&&t[f].r==r)
{
t[f].ly+=1;
t[f].v+=1;
return;
}
down(f);
int mid=(t[f].l+t[f].r)/2;
if(r<=mid)
update(l,r,f<<1);
else if(l>mid)
update(l,r,f<<1|1);
else
{
update(l,mid,f<<1);
update(mid+1,r,f<<1|1);
}
}
int query(int l,int f)
{
if(t[f].l==t[f].r)
return t[f].v;
down(f);
int mid=(t[f].l+t[f].r)/2;
if(l<=mid)
return query(l,f<<1);
else
return query(l,f<<1|1);
}
int main()
{
int t=1;
int cas;
scanf("%d",&cas);
while(cas--)
{
mp.clear();
scanf("%d%d",&n,&m);
int cnt=0;
for(int i=1; i<=n; i++)
{
scanf("%d%d",&s[i],&e[i]);
tim[cnt++]=s[i];
tim[cnt++]=e[i];
}
for(int i=1; i<=m; i++)
{
scanf("%d",&q[i]);
tim[cnt++]=q[i];
}
sort(tim,tim+cnt);
int tot=1;
mp[tim[0]]=tot++;
for(int i=1; i<cnt; i++)
{
if(tim[i]!=tim[i-1])
{
mp[tim[i]]=tot++;
}
}
tot--;
built(1,tot,1);
for(int i=1; i<=n; i++)
{
update(mp[s[i]],mp[e[i]],1);
}
printf("Case #%d:\n",t++);
for(int i=1; i<=m; i++)
{
int ans=query(mp[q[i]],1);
printf("%d\n",ans);
}
}
return 0;
}