HDU 5124 树状数组+map操作

 看到这道题毫无疑问就是线段树做,在2个小时的时间卡死在这道题了。。。一直觉得会超内存,后来看了题解才知道自己真是笨的可以。。。题目做的太少的缘故吧。。。这道题正好是点更新,果断放弃了线段树,用树状数组来搞(结果到最后也没有更新,反正趁机又复习了一下树状数组),第一次用map,感觉真是好用啊。。。下面是ac代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>

using namespace std;

const int maxn = 100005;
int a[maxn<<1],c[maxn<<1],n;
map <long long,int> u;

int lowbit(int x)
{
    return x&(-x);
}
void init()
{
    memset(c,0,sizeof(c));
    for(int i=1;i<=n;i++)
    {
        for(int j=i-lowbit(i)+1;j<=i;j++)
        {
            c[i]+=a[j];
        }
    }
}
int Sum(int i)
{
    int sum=0;
    while(i)
    {
        sum+=c[i];
        i-=lowbit(i);
    }
    return sum;
}
void change(int i,int x)
{
    while(i<=n)
    {
        c[i]+=x;
        i+=lowbit(i);
    }
}
int main()
{
    int tCase;
    scanf("%d",&tCase);
    while(tCase--)
    {
        int N;
        scanf("%d",&N);
        n=0;
        u.clear();
        while(N--)
        {
            long long x,y;
            scanf("%I64d%I64d",&x,&y);
            u[x]=u[x]+1;
            u[y+1]=u[y+1]-1;
        }
        map <long long,int> :: iterator iter;
        for(iter=u.begin();iter!=u.end();iter++)
        {
            a[++n]=iter->second;
        }
        init();
        int ans=0;
        for(int i=0;i<n;i++)
        {
            int sum=Sum(i);
            if(ans<sum)
                ans=sum;
        }
        printf("%d\n",ans);
    }
    return 0;
}


posted @ 2014-11-30 01:10  hqwhqwhq  阅读(343)  评论(0编辑  收藏  举报