POJ 1541 Stars(树状数组)

题目传送门

  • 才入门树状数组,没有搞懂这个题和树状数组有什么联系,其实这个题虽然给的是一个二维的图,但是可以把它放到一维来看,首先他给出的x,y是有顺序的,y一定的时候,后面给出的一定比前面的level高,而这里的y一定的情况下按照x的顺序排列,所以就可以把他当成一个x轴
    下面用题目的样例来解释
5
1 1
5 1
7 1
3 3
5 5

首先y等于1的时候,输入x
这个时候查找x前面所有的和就是它的level
此时level0=1,level1=1,level2=1;

1	5	7//对应的x
1	1	1//对应的树状数组

然后输入y等于3的时候,就插进去一个x=3
level2+1=2

1	3	5	7
1	1	1	1

y=5的时候,插进去x=5,已经存在了,这个时候把5这里的树状数组的值更新为加1
level3=1

1	3	5	7
1	1	2	1

完整代码

#include <iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<vector>
#include<queue>
#include<string>
#include <cmath>
#include<set>
#define mod 999997
#define lson l, mid, root << 1
#define rson mid + 1, r, root << 1 | 1
#define father  l , r , root
#define lowbit(x) ( x & ( - x ) )
using namespace std;
typedef long long ll;
const int maxn = 32010;
const int inf = 0x3f3f3f3f;

int cnt[maxn];
int a[maxn];

int sum(int x){
    int ans=0;
    for(int i=x;i>0;i-=lowbit(i)){
        ans+=a[i];
    }
    return ans;
}

void update(int x){

    for(int i=x;i<=maxn;i+=lowbit(i)){
        a[i]++;
    }

}

int main( ){
   int n;
   while(~scanf("%d",&n)){
        //scanf("%d",&n);
        memset(cnt,0,sizeof(cnt));
        memset(a,0,sizeof(a));
        for(int i=0;i<n;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            cnt[sum(x+1)]++;
            update(x+1);//更新该位置的值+1
        }
        for(int i=0;i<n;i++){
            printf("%d\n",cnt[i]);
        }
   }
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值