线段树和树状数组都可以用
#include
<
stdio.h
>
#include < stdlib.h >
const int LEN = 15005 ;
// 坐标处理
struct NODE
{
int x; //X坐标
int y; //Y坐标
int addr; //第几个点
} node[LEN];
int cmp ( const void * a, const void * b )
{
int ans = ( (NODE *)a )->x-( (NODE *)b )->x;
if ( !ans )
{
ans = ( (NODE *)a )->y-( (NODE *)b )->y;
}
return ans;
}
// 记录答案的数组
int answer[LEN];
// 线段树
struct
{
int num; //区间中点的个数
int b, e; //左右区间
int lson, rson; //左右孩子
} tree[LEN * 25 ];
int next_tree;
void creat ( int b, int e ) // 建树
{
int p = next_tree;
next_tree ++;
tree[p].b = b;
tree[p].e = e;
tree[p].lson = -1;
tree[p].rson = -1;
tree[p].num = 0;
if ( b!=e )
{
tree[p].lson = next_tree;
creat ( b, (b+e)/2 );
tree[p].rson = next_tree;
creat ( (b+e)/2+1, e );
}
}
void ins ( int p, int key ) // 插入一个结点
{
if ( tree[p].b==tree[p].e )
{
tree[p].num ++;
}
else
{
int mid = ( tree[p].b+tree[p].e )/2;
if ( key>mid )
{
ins ( tree[p].rson, key );
}
else
{
ins ( tree[p].lson, key );
}
tree[p].num = tree[ tree[p].lson ].num+tree[ tree[p].rson ].num;
}
}
int ser ( int p, int key ) // 查找函数
{
if ( tree[p].b==tree[p].e )
{
return tree[p].num;
}
else
{
int mid = ( tree[p].b+tree[p].e )/2;
if ( key>mid )
{
return tree[ tree[p].lson ].num + ser ( tree[p].rson, key );
}
else
{
return ser ( tree[p].lson, key );
}
}
}
void work ( int n, int max ) // 主要的工作函数
{
next_tree = 0;
for ( int i=0; i<n; i++ )
{
answer[i] = 0;
}
qsort ( node, n, sizeof ( NODE ), cmp );
creat ( 0, max );
for ( int i=0; i<n; i++ )
{
int addr = ser ( 0, node[i].y );
answer[addr] ++ ;
ins ( 0, node[i].y );
}
}
int main ()
{
int n;
int max = -1;;
scanf ( "%d", &n );
for ( int i=0; i<n; i++ )
{
scanf ( "%d%d", &node[i].x, &node[i].y );
node[i].addr = i;
if ( node[i].y>max )
{
max = node[i].y;
}
}
work ( n, max );
for ( int i=0; i<n; i++ )
{
printf ( "%d\n", answer[i] );
}
}
#include < stdlib.h >
const int LEN = 15005 ;
// 坐标处理
struct NODE
{
int x; //X坐标
int y; //Y坐标
int addr; //第几个点
} node[LEN];
int cmp ( const void * a, const void * b )
{
int ans = ( (NODE *)a )->x-( (NODE *)b )->x;
if ( !ans )
{
ans = ( (NODE *)a )->y-( (NODE *)b )->y;
}
return ans;
}
// 记录答案的数组
int answer[LEN];
// 线段树
struct
{
int num; //区间中点的个数
int b, e; //左右区间
int lson, rson; //左右孩子
} tree[LEN * 25 ];
int next_tree;
void creat ( int b, int e ) // 建树
{
int p = next_tree;
next_tree ++;
tree[p].b = b;
tree[p].e = e;
tree[p].lson = -1;
tree[p].rson = -1;
tree[p].num = 0;
if ( b!=e )
{
tree[p].lson = next_tree;
creat ( b, (b+e)/2 );
tree[p].rson = next_tree;
creat ( (b+e)/2+1, e );
}
}
void ins ( int p, int key ) // 插入一个结点
{
if ( tree[p].b==tree[p].e )
{
tree[p].num ++;
}
else
{
int mid = ( tree[p].b+tree[p].e )/2;
if ( key>mid )
{
ins ( tree[p].rson, key );
}
else
{
ins ( tree[p].lson, key );
}
tree[p].num = tree[ tree[p].lson ].num+tree[ tree[p].rson ].num;
}
}
int ser ( int p, int key ) // 查找函数
{
if ( tree[p].b==tree[p].e )
{
return tree[p].num;
}
else
{
int mid = ( tree[p].b+tree[p].e )/2;
if ( key>mid )
{
return tree[ tree[p].lson ].num + ser ( tree[p].rson, key );
}
else
{
return ser ( tree[p].lson, key );
}
}
}
void work ( int n, int max ) // 主要的工作函数
{
next_tree = 0;
for ( int i=0; i<n; i++ )
{
answer[i] = 0;
}
qsort ( node, n, sizeof ( NODE ), cmp );
creat ( 0, max );
for ( int i=0; i<n; i++ )
{
int addr = ser ( 0, node[i].y );
answer[addr] ++ ;
ins ( 0, node[i].y );
}
}
int main ()
{
int n;
int max = -1;;
scanf ( "%d", &n );
for ( int i=0; i<n; i++ )
{
scanf ( "%d%d", &node[i].x, &node[i].y );
node[i].addr = i;
if ( node[i].y>max )
{
max = node[i].y;
}
}
work ( n, max );
for ( int i=0; i<n; i++ )
{
printf ( "%d\n", answer[i] );
}
}