hdu 4325 Flowers

Problem F

Time Limit: 4000/2000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 332    Accepted Submission(s): 143
Problem Description
As is known to all, the blooming time and duration varies between different kinds of flowers. Now there is a garden planted full of flowers. The gardener wants to know how many flowers will bloom in the garden in a specific time. But there are too many flowers in the garden, so he wants you to help him.
 
Input
The first line contains a single integer t (1 <= t <= 10), the number of test cases.
For each case, the first line contains two integer N and M, where N (1 <= N <= 10^5) is the number of flowers, and M (1 <= M <= 10^5) is the query times.
In the next N lines, each line contains two integer Si and Ti (1 <= Si <= Ti <= 10^9), means i-th flower will be blooming at time [Si, Ti].
In the next M lines, each line contains an integer Ti, means the time of i-th query.
 
Output
For each case, output the case number as shown and then print M lines. Each line contains an integer, meaning the number of blooming flowers.
Sample outputs are available for more details.
 
SampleInput
2
1 1
5 10
4
2 3
1 4
4 8
1
4
6
 
SampleOutput
Case #1:
0
Case #2:
1
2
1
//水水噢
//区间覆盖问题,求某个区间被覆盖几次
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #define N 100000 #define lson l,m,k<<1 #define rson m+1,r,k<<1|1 using namespace std; int st[N<<2]; void build(int l,int r,int k) { st[k]=0; if(l==r) return; int m=(l+r)>>1; build(lson); build(rson); } void update(int &L,int &R,int l,int r,int k) { if(L<=l&&R>=r) { st[k]+=1; return ; } int m=(l+r)>>1; if(L<=m) update(L,R,lson); if(R>m) update(L,R,rson); } void query(int &i,int l,int r,int k) { if(l==r) { printf("%d\n",st[k]); return; } if(st[k]) { st[k<<1]+=st[k]; st[k<<1|1]+=st[k]; st[k]=0; } int m=(l+r)>>1; if(i<=m) query(i,lson); else query(i,rson); } int main() { int T,t=1; int i,n,m; int s,e; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); build(1,N,1); printf("Case #%d:\n",t++); for(i=1;i<=n;i++) { scanf("%d%d",&s,&e); update(s,e,1,N,1); } while(m--) { scanf("%d",&s); query(s,1,N,1); } } return 0; }
原文地址:https://www.cnblogs.com/372465774y/p/2621484.html