http://acm.hdu.edu.cn/showproblem.php?pid=4325
2 1 1 5 10 4 2 3 1 4 4 8 1 4 6
Case #1: 0 Case #2: 1 2 1
/** hdu 4325 树状数组+离散化 题目大意:给定n朵花,每朵花开放的时间段,然后m个询问:ti时间点有多少花正在盛开 解题思路:树状数组裸体,不过要离散化花开放的时间 */ #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const int maxn=300005; int n,m,k; int C[maxn],a[maxn]; struct note { int x,id; bool operator <(const note &other)const { return x<other.x; } }p[maxn]; int lowbit(int i) { return i&(-i); } int sum(int x) { int cnt=0; while(x>0) { cnt+=C[x]; x-=lowbit(x); } return cnt; } void update(int pos,int value) { while(pos<=k) { C[pos]+=value; pos+=lowbit(pos); } } int main() { int T,tt=0; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); int nn=n*2; int mm=nn+m; for(int i=0;i<mm;i++) { scanf("%d",&p[i].x); p[i].id=i; } sort(p,p+mm); k=1; a[p[0].id]=k; for(int i=1;i<mm;i++) { if(p[i].x==p[i-1].x) { a[p[i].id]=k; } else a[p[i].id]=++k; } memset(C,0,sizeof(C)); for(int i=0;i<nn-1;i+=2) { update(a[i],1); update(a[i+1]+1,-1); } printf("Case #%d:\n",++tt); for(int i=nn;i<mm;i++) { printf("%d\n",sum(a[i])); } } return 0; }
原文:http://blog.csdn.net/lvshubao1314/article/details/43560791