您的位置:首页 > 其它

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

2017-11-26 19:43 429 查看
http://acm.hdu.edu.cn/showproblem.php?pid=4325

题意:
给出n个区间和m个询问,每个询问为一个x,问有多少个区间包含了x。

思路:

因为数据量比较多,所以需要离散化。区间的离散化需要注意一下,如果端点不连续的话,需要额外插点。

区间情况就用树状数组来维护。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 2*1e5+5;

int n, m, tot;
int a[maxn+1000],c[maxn];

struct node
{
int l,r;
}query[maxn/2];

int lowbit(int x)
{
return x&-x;
}

int sum(int x)
{
int ret = 0;
while(x>0)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}

void add(int x, int d)
{
while(x<=maxn)
{
c[x]+=d;
x+=lowbit(x);
}
}

int main()
{
//freopen("in.txt","r",stdin);
int T;
int kase = 0;
scanf("%d",&T);
while(T--)
{
tot = 0;
memset(c,0,sizeof(c));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&query[i].l,&query[i].r);
a[tot++] = query[i].l;
a[tot++] = query[i].r;
}
a[tot++] = 0;
sort(a,a+tot);
int tmp = tot;
for(int i=1;i<tmp;i++)
if(a[i]-a[i-1]>1)  a[tot++] = a[i]-1;
sort(a,a+tot);
int num = unique(a,a+tot)-a;
for(int i=1;i<=n;i++)
{
int l = lower_bound(a,a+num,query[i].l)-a;
int r = lower_bound(a,a+num,query[i].r)-a;
add(l,1);
add(r+1,-1);
}
printf("Case #%d:\n",++kase);
while(m--)
{
int x; scanf("%d",&x);
x = lower_bound(a,a+num,x)-a;
printf("%d\n",sum(x));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: