poj 2352(树状数组)

        这道题好像被贱做了,看起来像二维的树状数组,其实只是一维的,可能是数据太大了,矩阵开不那么大,因为题意是求一个矩阵中做它左下部分的个数,而去输入的顺序是按y升序,后x升序输入。其实如果不按这个顺序可以下排序。

       然后就是一维的树状数组的思路了。

转个图,可以知道它的这数组性质了:http://dongxicheng.org/structure/binary_indexed_tree/


#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;


const int MAX_STARS=15005;
const int MAX_COOR=32005;


int tree[MAX_COOR];
int totalNumLev[MAX_STARS];


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


//计算数组A[1...x]的和
int sum(int x) {
    int s = 0;
    while(x > 0) {
            s += tree[x];
        x -= lowBit(x);
    }


        return s;}


/、将A[x]的值增加t
void update(int x, int t) {
    while(x < MAX_COOR) {
    tree[x] += t;
    x += lowBit(x);
    }
}


int main()
{
    int cas;
    int r,c;
    cin>>cas;
    int m=cas;
    while(cas--)
    {
      cin>>r>>c;//c是没有用的
      ++r;
      int le=sum(r);
      totalNumLev[le]++;
      update(r,1);
    }
    for(int i=0;i<m;i++)
    cout<<totalNumLev[i]<<endl;
return 0;
}

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值