• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
ACM s1124yy
守りたいものが 強くさせること
博客园    首页    新随笔    联系   管理     

POJ 2352 Stars(树状数组)

题解:仔细想下,这题的y没有用,有用的只是x,x出现一次就加一次(这里是x+1,因为x可能等于0),之后再把0到x的全部值加一遍,得出的tem用ans数组记录下来,最后输出即可。

AC代码:

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

using namespace std;

const int MAX_N=15005;
const int MAX_B=15005<<2;//范围尽量开大  4倍 也就是和线段树一样

int bit[MAX_B],n;
int ans[MAX_N];

int sum(int i)//相加是减到最根节点
{
    int s=0;
    while(i>0)
    {
        s+=bit[i];
        i-=i&-i;
    }
    return s;
}
void add(int i,int x)//修改是不断向父节点延伸
{
    while(i<=MAX_B)/**< 最重要的就是这!! 这是i<=MAXB  而不是n!! */
    {
        bit[i]+=x;
        i+=i&-i;
    }
}
int main()
{
    while(scanf("%d",&n)!=EOF)///输入全用scan = =用cin的我超了好几次时
    {
        memset(ans,0,sizeof(ans));
        memset(bit,0,sizeof(bit));
        int x,y;
        for (int i=1;i<=n;i++)
        {
            scanf("%d%d",&x,&y);
            int tem=sum(x+1);
            ans[tem]++;
            add(x+1,1);
        }
        for (int i=0;i<n;i++)
        {
            printf("%d\n",ans[i]);
        }
    }
    return 0;
}

 

posted @ 2016-05-13 15:49  s1124yy  阅读(153)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3