zoukankan      html  css  js  c++  java
  • POJ2182 Lost Cows 树状数组,二分

    题意:给n个奶头身高从1到n,现在奶牛排成一列,给n-1个数字,为第二号奶牛到第n号奶牛前面比它矮的奶牛个数。

    求这个序列每个奶牛的身高。

    思路:从最后一个奶牛开始判断,因为最后一个奶牛是和前面所有奶牛做比较的,我们可以根据比它矮的奶牛个数确定它的身高,如果前面有3个比它矮那么它身高绝对为4,而继续判断前一个奶头身高时,要把这个奶牛剔除考虑,

    所以我们想到可以维护一个长度为n的01序列,为1表示奶牛还在,奶牛从后往前遍历,设比它矮的有k个,每次找奶牛身高,就是找存在的奶牛中k+1的位置,也就是前缀和为k+1的位置,每次可以二分来判断位置,0(1)删除一个奶牛

    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn=8e3+10;
    #define ll long long
    int a[maxn];
    int c[maxn];
    int n;
    int ans[maxn];
    int ask(int x)
    {
        int ans=0;
        for(; x; x-=x&-x)
            ans+=c[x];
        return ans;
    }
    void add(int x,int y)
    {
        for(; x<=n; x+=x&-x) c[x]+=y;
    }
    int vis[maxn];
    int main()
    {
        scanf("%d",&n);
        for(int i=2; i<=n; i++)
            scanf("%d",&a[i]);
        for(int i=1; i<=n; i++)
            add(i,1);
        for(int i=n; i>=2; i--)
        {
            int l,r,mid;
            l=1,r=n;
            while(l<=r)
            {
                mid=(l+r)/2;
                int t=ask(mid);
                if(t>=a[i]+1)
                    r=mid-1;
                else
                    l=mid+1;
            }
            ans[i]=l;
            vis[l]=1;
            add(l,-1);
        }
        for(int i=1; i<=n; i++)
        {
            if(vis[i]==0)
            {
                ans[1]=i;
                break;
            }
        }
        for(int i=1; i<=n; i++)
            printf("%d
    ",ans[i]);
    }
  • 相关阅读:
    不同版本strtotime("2016-09-04")输出不同问题
    Jquery,YUI这个著名js库名称作用的理解
    函数和方法
    js的关联数组
    windows信息
    改centos7的网卡名
    GIT命令
    安装时遇到:正在尝试其它镜像。 http://mirrors.btte.net/centos/7.2.1511/extras/x86_64/repodata/repomd.xml: [Errno 14] curl#6
    本地怎样访问虚拟机上的服务器
    yolo
  • 原文地址:https://www.cnblogs.com/dongdong25800/p/11613863.html
Copyright © 2011-2022 走看看