hdu4325-Flowers-2012 Multi-University Training Contest 3-题解

来源:互联网 发布:淘宝网站设计 编辑:程序博客网 时间:2024/06/15 19:53

Brief Description:

有一些花,给定每朵花的开花时间和凋零时间,现在给出一些询问,询问在某个时刻有多少花处于开花状态的。

Analysis:

经典的“区间更新,单点查询”,可以用线段树或树状数组做,推荐用树状数组。

由于题目规模不大,所以离散化时用Map比较方便。

具体见以下代码:

#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <map>#include <algorithm>#define M 100005using namespace std;int hash[M*4],s[M],t[M],qry[M],c[M*4];int n,m;inline int lowbit(int x){    return x & (-x);}int cnt;// 区间更新void add(int x,int m){     while(x){         c[x] += m;         x -= lowbit(x);     }}// 单点查询int sum(int x){   int ret = 0; // return   while(x <= cnt){       ret += c[x];       x += lowbit(x);   }   return ret;}int main(){    int cas,ta=1;    scanf("%d",&cas);    while(cas--){        int i,j,num=0;        scanf("%d%d",&n,&m);        for(i=0; i<n; i++){            scanf("%d%d",s+i,t+i);            hash[num++] = s[i];    hash[num++] = t[i];        }        for(i=0; i<m; i++){           scanf("%d",qry+i);   hash[num++] = qry[i];        }        sort(hash,hash+num);        int pre = -1;        cnt = 0;        map<int,int>Map;        for(i=0; i<num; i++){           if(hash[i] != pre){              pre = hash[i];              Map[hash[i]] = ++cnt;           }        }        memset(c,0,sizeof(c));        for(i=0; i<n; i++){           add(Map[s[i]]-1,-1);           add(Map[t[i]],1);        }        printf("Case #%d:\n",ta++);        for(i=0; i<m; i++){           printf("%d\n",sum(Map[qry[i]]));        }    }    return 0;}


原创粉丝点击