标签:
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