这道题好像被贱做了,看起来像二维的树状数组,其实只是一维的,可能是数据太大了,矩阵开不那么大,因为题意是求一个矩阵中做它左下部分的个数,而去输入的顺序是按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;
}