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;
}
 
                    
                 
                
            
         
 浙公网安备 33010602011771号
浙公网安备 33010602011771号