poj 2352(树状数组)

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

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

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

poj 2352(树状数组)_第1张图片

 
 
#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;
}

  

你可能感兴趣的:(c,tree)