#include
<
iostream
>
#define C 32001
using namespace std;
int B[C] = { 0 };
int A[C] = { 0 };
inline int lowBit( int t) {
return t & ( - t);
}
void change( int n, int m) {
while (n <= C) {
B[n] += m;
n += lowBit(n);
}
}
int sum( int n) {
int p = 0 ;
while (n > 0 ) {
p += B[n];
n -= lowBit(n);
}
return p;
}
int main()
{
int n;
int x,y;
scanf( " %d " , & n);
for ( int i = 0 ;i < n; ++ i)
{
scanf( " %d%d " , & x, & y);
++ x;
change(x, 1 );
++ A[sum(x) - 1 ];
}
for ( int i = 0 ;i < n; ++ i)
{
printf( " %d " ,A[i]);
}
}
#define C 32001
using namespace std;
int B[C] = { 0 };
int A[C] = { 0 };
inline int lowBit( int t) {
return t & ( - t);
}
void change( int n, int m) {
while (n <= C) {
B[n] += m;
n += lowBit(n);
}
}
int sum( int n) {
int p = 0 ;
while (n > 0 ) {
p += B[n];
n -= lowBit(n);
}
return p;
}
int main()
{
int n;
int x,y;
scanf( " %d " , & n);
for ( int i = 0 ;i < n; ++ i)
{
scanf( " %d%d " , & x, & y);
++ x;
change(x, 1 );
++ A[sum(x) - 1 ];
}
for ( int i = 0 ;i < n; ++ i)
{
printf( " %d " ,A[i]);
}
}
这是一道经典题目。
第一想法是二维树状数组统计,但通常可以通过对一维排序, 统计另一维即可。
类似的题目:http://acm.pku.edu.cn/JudgeOnline/problem?id=2352