zoukankan      html  css  js  c++  java
  • POJ 2182/暴力/BIT/线段树

    POJ 2182

    • 暴力
    /*
    题意:
    一个带有权值[1,n]的序列,给出每个数的前面比该数小的数的个数,当然比一个数前面比第一个数小的个数是0,省略不写,求真正的序列。(拗口)
    首先想到的是从前到后暴力枚举暴力枚举。数据量为8000,O(n^2)。
    */
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #include<deque>
    #include<set>
    using namespace std;
    const int maxn=8000+10;
    int ans [maxn];
    int a[maxn];
    int vis[maxn];
    int N;
    int main ()
    {
        scanf("%d",&N);
        for(int i=2;i<=N;i++)
            scanf("%d",&a[i]);
    
        for(int i=N;i>=1;i--)
        {
            int t=0,j;
            for( j=1;j<=N;j++)//遍历1~ ~N;
            {
               if(!vis[j])
               {
                   t++;
                   if(t==a[i]+1)
                       break;
               }
            }
            ans[i]=j;
            vis[j]=1;
        }
        for(int i=1;i<=N;i++)
            printf("%d
    ",ans[i]);
        return 0;
    }
    /*
    其实BIT的算法跟暴力的思想是一样的,只是实现的不同BIT维护的是i前面
    比i小的数出现的个数num[i](因为是从后向前遍历的,这些出现过的数是
    在后面用过的数,不参与i的计算)。然后i-1-num[i]就是比i小的个数。
    然后用二分的思想,找到的个数与实际个数比较。
    */
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn=10000+5;
    int c[maxn];
    int a[maxn];
    int n;
    int lowbit(int x)
    {
        return x&(-x);
    }
    void add(int i,int x)
    {
        while(i<=n)
        {
            c[i]+=x;
            i+=lowbit(i);
        }
    }
    int sum(int i)
    {
        int ret=0;
        while(i>0)
        {
            ret+=c[i];
            i-=lowbit(i);
        }
        return ret;
    }
    int solve(int x)
    {
        int l=1;
        int r=n;
        while(l<r)
        {
            int m=(l+r)>>1;
            int cnt=sum(m);
            if(m-1-cnt>=x)
                r=m;
            else
                l=m+1;
        }
        return l;
    }
    int main ()
    {
        while(~scanf("%d",&n))
        {
            a[0]=0;
            for(int i=1;i<n;i++)
                scanf("%d",&a[i]);
            for(int i=n-1;i>=0;i--)
            {
                int x=solve(a[i]);
                a[i]=x;
                add(a[i],1);
            }
            for(int i=0;i<n;i++)
                printf("%d
    ",a[i]);
        }
    }
    想的太多,做的太少。
  • 相关阅读:
    ElasticSearch入门到筋痛
    JavaScript学习(四)
    JavaScript学习(三)
    JavaScript学习(二)
    JavaWeb学习(一)
    final
    static
    object的方法
    java 数据类型
    spring mvc
  • 原文地址:https://www.cnblogs.com/pealicx/p/6115588.html
Copyright © 2011-2022 走看看