POJ 2352 线段树+树状数组

第一次用,用来学习

树状数组。。。

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

你可能感兴趣的:(树状数组)