HDU 4325 Flowers(树状数组+离散化)

来源:互联网 发布:jk js 编辑:程序博客网 时间:2024/06/03 10:23
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <queue> #include <string> #include <cstring> #include <map> #include <stack> #include <set> #include <list>#define INF 0x3f3f3f#define maxn 100000 + 50 #define juzheng 300#define ll long longusing namespace std;//Date:2017-9-4//Author:HarryBlackCat struct xx{    int s;    int e;}time[maxn];int arr[maxn],tree[maxn],que[maxn],n,m,counter;int lowbit(int x){    return x & (-x);}void add(int index,int val,int n){    for(int i = index;i <= n;i += lowbit(i))        tree[i] += val;}int get_sum(int index){    int ans = 0;    for(int i = index ;i > 0; i -=lowbit(i))        ans += tree[i];    return ans; }void init(){    memset(arr,0,sizeof(arr));    memset(tree,0,sizeof(tree));    memset(que,0,sizeof(que));    counter = 0; }int main(){    int t;    while(cin >> t){        for(int p = 1;p <= t;p++){            init();            cin >> n >> m;            for(int i = 1;i <= n;i++){                cin >> time[i].s >> time[i].e;                //将时间段存入待处理的离散化数组                 arr[++counter] = time[i].s;                 arr[++counter] = time[i].e;            }            for(int i = 1;i <= m;i++){                cin >> que[i];                //将询问时间点存入待处理的离散化数组                 arr[++counter] = que[i];            }             //离散化处理             sort(arr + 1,arr + 1 + counter);//排序             int len = unique(arr + 1,arr + 1 + counter) - arr - 1;//去重,并记录去重后的长度             for(int i = 1;i <= n;i++){                int s = lower_bound(arr + 1,arr + 1 + len,time[i].s) - arr - 1 + 1;//找到开始点在离散化数组的下标(+1是表示从1开始算起)                 int e = lower_bound(arr + 1,arr + 1 + len,time[i].e) - arr - 1 + 1;//找到结束点在离散化数组的下标                //利用树状数组储存离散化的区间                 add(s,1,len);                add(e + 1,-1,len);            }            printf("Case #%d:\n",p);            for(int i = 1;i <= m;i++){                int index = lower_bound(arr + 1,arr + 1 + len,que[i]) - arr - 1 + 1;//找到询问点的离散化数组中的下标                 printf("%d\n",get_sum(index));//输出ans             }        }    }    return 0;}