hdu4325 Flowers(树状数组)

题意是:给你n个区间表示n朵花的开花时间段,然后给q个查询,每次查询某时间点正在开的花的数量。

这题可以用线段树,但是区间长度最长是1e9太大,需要离散化,这里给一个树状数组的做法。

题目也不是很难,应该属于套路性很强的题。

  树状数组写法也很套路,先写3个函数lowbit(),add(),sum()。然后每给一个区间[a,b],我们就这样操作add(a,1),add(b+1,-1),然后给出一个查询的时间c,我们就输出sum(c)。 为什么这么写的话就自己理解一下了,贴这题只是加强一下对于树状数组的理解。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;
const int maxn=1e5+5;

int c[maxn];
int t,n,q;

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

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

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


int main()
{
    int a,b,tem;
    scanf("%d",&t);
    for(int i=1; i<=t; i++)
    {
        memset(c,0,sizeof(c));
        printf("Case #%d:\n",i);
        scanf("%d%d",&n,&q);
        while(n--)
        {
            scanf("%d%d",&a,&b);
            add(a,1);
            add(b+1,-1);

        }
        while(q--)
        {
            scanf("%d",&tem);
            printf("%d\n",sum(tem));
        }
    }
}

猜你喜欢

转载自blog.csdn.net/zero___zero/article/details/81139886