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

posted on 2011-05-27 22:27  Wizmann  阅读(190)  评论(0)    收藏  举报

导航