MUTC 3 A - Flowers 树状数组
Flowers
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1829 Accepted Submission(s): 901
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.
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.
Sample outputs are available for more details.
Sample Input
2 1 1 5 10 4 2 3 1 4 4 8 1 4 6
Sample Output
Case #1: 0 Case #2: 1 2 1
Author
BJTU
Source
Recommend
zhoujiaqi2010
离散
--------------------
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int maxn=211111; int n,m; int s[maxn],t[maxn]; int b[maxn]; int tree[maxn]; int q[maxn]; int ans[maxn]; int mn,nn; int lowbit(int x) { return x&(-x); } void add(int x,int val) { for (int i=x;i<=mn;i+=lowbit(i)) { tree[i]+=val; } } int query(int x) { int ret=0; for (int i=x;i>0;i-=lowbit(i)) { ret+=tree[i]; } return ret; } int main() { int T,cnt=0; scanf("%d",&T); while (T--) { memset(tree,0,sizeof(tree)); scanf("%d%d",&n,&m); nn=1; for (int i=1;i<=n;i++) { scanf("%d%d",&s[i],&t[i]); b[nn++]=s[i]; b[nn++]=t[i]; } for (int i=1;i<=m;i++) { scanf("%d",&q[i]); b[nn++]=q[i]; } sort(b+1,b+nn); mn=1; for (int i=2;i<nn;i++) { if (b[i]!=b[i-1]) b[++mn]=b[i]; } //for (int i=1;i<=mn;i++) cerr<<b[i]<<" ";cerr<<endl; for (int i=1;i<=n;i++) { int l=lower_bound(b+1,b+mn+1,s[i])-b; int r=lower_bound(b+1,b+mn+1,t[i])-b; //cerr<<"l="<<l<<" r="<<r<<endl; add(l,1); add(r+1,-1); } printf("Case #%d:\n",++cnt); for (int i=1;i<=m;i++) { int l=lower_bound(b+1,b+mn+1,q[i])-b; printf("%d\n",query(l)); } } return 0; }