给你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; }