第一次用,用来学习
树状数组。。。
#include < cstdio >
#include < cstdlib >
#include < cstring >
#define MAX 32005
inline int lowbit( int n){ return n & ( - n);}
int number[MAX + 5 ];
int tree[MAX + 5 ];
int sum( int n)
{
int res = 0 ;
while (n > 0 )
{
res += tree[n];
n -= lowbit(n);
}
return res;
}
void update( int n, int val)
{
while (n < MAX)
{
tree[n] += val;
n += lowbit(n);
}
}
int main()
{
freopen( " input.txt " , " r " ,stdin);
int n,x,y;
scanf( " %d " , & n);
for ( int i = 0 ;i < n;i ++ )
{
scanf( " %d%d " , & x, & y);
number[sum(x + 1 )] ++ ;
update(x + 1 , 1 );
}
for ( int i = 0 ;i < n;i ++ ) printf( " %d\n " ,number[i]);
return 0 ;
}
线段树
#include < cstdio >
#include < cstring >
#include < cstdlib >
#define MAX 32768
#define START 0
typedef struct node
{
int l,r;
int val;
void setnode( int a, int b)
{
l = a;r = b;
val = 0 ;
}
}node;
node stree[MAX * 16 ];
int number[MAX + 10 ];
inline int left( int n){ return 2 * n + 1 ;}
inline int right( int n){ return 2 * n + 2 ;}
inline int mid( int a, int b){ return (a + b) / 2 ;}
void init( int pos, int l, int r)
{
stree[pos].setnode(l,r);
if (l < r)
{
int m = mid(l,r);
init(left(pos),l,m);
init(right(pos),m + 1 ,r);
}
}
int query( int pos, int x)
{
if (stree[pos].l == x && stree[pos].r == x) return stree[pos].val;
int m = mid(stree[pos].l,stree[pos].r);
if (x <= m) return query(left(pos),x) + stree[pos].val;
else return query(right(pos),x) + stree[pos].val;
}
void ins( int pos, int l, int r, int val)
{
if (stree[pos].l == l && stree[pos].r == r) stree[pos].val += val;
else
{
int m = mid(stree[pos].l,stree[pos].r);
if (r <= m) ins(left(pos),l,r,val);
else if (l > m) ins(right(pos),l,r,val);
else
{
ins(left(pos),l,m,val);
ins(right(pos),m + 1 ,r,val);
}
}
}
int main()
{
freopen( " input.txt " , " r " ,stdin);
int n,x,y;
init(START, 0 ,MAX);
scanf( " %d " , & n);
for ( int i = 0 ;i < n;i ++ )
{
scanf( " %d%d " , & x, & y);
number[query(START,x + 1 )] ++ ;
ins(START,x + 1 ,MAX, 1 );
}
for ( int i = 0 ;i < n;i ++ ) printf( " %d\n " ,number[i]);
return 0 ;
}