poj2352-线段树-start

来源:互联网 发布:hr系统人力资源软件 编辑:程序博客网 时间:2024/06/09 15:05

线段树

#include <iostream>#include <cstdio>#include <cstring>#define N 32010using namespace std;struct tree{    int l,r;    int sum;}a[4*N];void build(int l,int r,int k){    a[k].l=l;a[k].r=r;a[k].sum=0;    if(l==r){      return;    }    int mid=(a[k].l+a[k].r)>>1;    build(l,mid,k<<1);    build(mid+1,r,k<<1|1);}int query(int l,int r,int k){    int as=0;    if(a[k].l==l&&a[k].r==r){        return a[k].sum;    }    else{       int mid=(a[k].l+a[k].r)>>1;      if(l>mid){        as+=(query(l,r,k<<1|1));       }       else if(r<=mid){         as+=(query(l,r,k<<1));       }       else          as+=(query(l,mid,k<<1)+query(mid+1,r,k<<1|1));       return as;    }}void ins(int x,int k){    a[k].sum++;    if(a[k].l==a[k].r&&a[k].r==x){        return;    }    int mid=(a[k].l+a[k].r)>>1;    if(x<=mid)        ins(x,k<<1);    else        ins(x,k<<1|1);}int main(){    int n;    while(~scanf("%d",&n)){      build(0,N,1);      int x,y,ans[15010];      memset(ans,0,sizeof(ans));      for(int i=1;i<=n;++i){        scanf("%d%d",&x,&y);        ans[query(0,x,1)]++;        ins(x,1);      }      for(int i=0;i<n;++i)          printf("%d\n",ans[i]);    }    return 0;}



0 0