poj2352

来源:互联网 发布:中盟网络快运 编辑:程序博客网 时间:2024/06/06 11:38
//poj2352求该点包含的点时所有比它低的点都已经加过#include<iostream>#include<cstdio>using namespace std;int a[32005];int b[32005];int tree[32001*4];void Build(int p,int l,int r,int x) //先建立0~x范围的分支{    if(l==r){        tree[p]++; //建立叶子节点        return;    }    int mid=(l+r)/2;    if(x<=mid) Build(p<<1,l,mid,x); //建立左子树    else Build(p<<1|1,mid+1,r,x); //建立右子树    tree[p]=tree[p<<1]+tree[p<<1|1]; //当前节点的值}/*void Update(int p,int l,int r,int x,int num){    if(l==r){ tree[p]+=num; return;}     int mid=(l+r)/2;    if(x<=mid) Update(p<<1,l,mid,x,num);    else Update(p<<1|1,mid+1,r,x,num);    tree[p]=tree[p<<1]+tree[p<<1|1]; }*/int Query(int p,int l,int r,int x,int y){    if(x<=l&&y>=r) return tree[p]; //返回要找的区间和    int mid=(l+r)/2;    if(y<=mid) return Query(p<<1,l,mid,x,y);    else if(x>mid) return Query(p<<1|1,mid+1,r,x,y);    else return (Query(p<<1,l,mid,x,mid)+Query(p<<1|1,mid+1,r,mid+1,y));}int main(){    int n;    scanf("%d",&n);    int x,y,maxn=-1;    for(int i=0;i<n;i++)    {        scanf("%d%d",&a[i],&y);        maxn=max(maxn,a[i]);    }    for(int i=0;i<n;i++)    {        Build(1,0,maxn,a[i]); //逐步建立0~a[i]范围的线段树        b[Query(1,0,maxn,0,a[i])-1]++;    }    for(int i=0;i<n;i++)    {        printf("%d\n",b[i]);    }    return 0;}

0 0
原创粉丝点击