poj 2182||hdu 2711

来源:互联网 发布:市场数据分析报告范文 编辑:程序博客网 时间:2024/06/07 12:06

题目链接


树状数组+二分

poj2182 AC  hdu2711 WA 有时间在研究吧

#include <cstdio>#include <cstring>using namespace std;#define maxn 8005int arr[maxn],a[maxn],s[maxn];int lowbit(int x){    return x&(-x);}void update(int x,int n){    while(x<=n)    {        arr[x]++;        x+=lowbit(x);    }}int getsum(int x){    int ans=0;    while(x>0)    {        ans+=arr[x];        x-=lowbit(x);    }    return ans;}int search(int x,int n){    int left=1,right=n,mid,temp;    while(left<right)    {        mid=(left+right)/2;        temp=mid-getsum(mid);        if(temp<x)        left=mid+1;        else        right=mid;    }    return left;}int main(){    int n,i,j,k;    while(scanf("%d",&n)!=EOF)    {        for(i=2;i<=n;i++) scanf("%d",&a[i]);        for(i=n;i>=1;i--)        {            k=search(a[i]+1,n);            update(k,n);            s[i]=k;        }        for(i=1;i<=n;i++) printf("%d\n",s[i]);    }    return 0;}

大神插空  都AC
#include <cstdio>using namespace std;#define maxn 8005int cow[maxn],d[maxn];int main(){    int i,head,t,n,num,current,m;    while(scanf("%d",&n)!=EOF)    {        head=1;        cow[head]=0;        for(i=2;i<=n;i++)        {            scanf("%d",&num);            if(num)            {                current=head;                while(--num) current=cow[current];                t=cow[current];                cow[current]=i;                cow[i]=t;            }            else            {                cow[i]=head;                head=i;            }        }        m=0;        for(i=head;i;i=cow[i]) d[i]=++m;        for(i=1;i<=n;i++)        printf("%d\n",d[i]);    }    return 0;}

算法


原创粉丝点击