HDU 5124 树状数组+map操作

来源:互联网 发布:京华科讯软件 编辑:程序博客网 时间:2024/06/07 22:16

 看到这道题毫无疑问就是线段树做,在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;}


0 0
原创粉丝点击