poj2352

来源:互联网 发布:中序遍历递归算法 编辑:程序博客网 时间:2024/06/05 17:45

输入顺序是有规律的,只需要x的值就可以建树了,同时,边建树边查找

#include <iostream>#include <stdio.h>#include <algorithm>using namespace std;const int maxn=32010;int tree[4*maxn];int x[maxn];int level[15010];void build(int p,int l,int r,int x){    if(l==r) {tree[p]++;return ;}    int mid=(l+r)/2;    if(x>mid) build(2*p+1,mid+1,r,x);    else build(2*p,l,mid,x);    tree[p]=tree[2*p+1]+tree[2*p];}int find_(int p,int l,int r,int x,int y){    if(l==x&&r==y) return tree[p];    int mid=(l+r)/2;    if(mid>=y) return find_(2*p,l,mid,x,y);    else if(mid<=x) return find_(2*p+1,mid,r,x,y);    else return find_(2*p,l,mid,x,mid)+find_(2*p+1,mid+1,r,mid+1,y);}int main(){    int n;cin>>n;    int max_x=-1;    for(int i=0;i<n;i++)    {        int y;        scanf("%d%d",&x[i],&y);        if(max_x<x[i]) max_x=x[i];    }    for(int i=0;i<n;i++)    {        build(1,0,max_x,x[i]);        level[find_(1,0,max_x,0,x[i])-1]++;    }    for(int i=0;i<n;i++)        printf("%d\n",level[i]);    return 0;}
原创粉丝点击