zoukankan      html  css  js  c++  java
  • poj2182 Lost Cows[BIT二分]

    blog题解鸽了许久了。。本来说好的切一题写一个题解的说


    一个$1 sim n$数列,已知每个数前面比他小的数个数,试确定该序列。


    相当的一道水题。可以发现数列最后一个数是首先可以确定下来的。然后把这个数扔掉,看数列倒数第二个数前面有多少更小的其实就是目前剩下的数中的排名。相当于有一颗$n$个点的$1 sim n$的平衡树,每次查一个排名,找出这个数,并删掉。但是并不想打平衡树。因为这题的操作只涉及简单的删除和查rank操作,可以考虑用BIT代替平衡树。具体是因为BIT本身就是具有树形二分结构的,画图应该可以感觉出来。$C[i]$表示值为i的数有几个(本题中最多$1$个,有些题还要离散化这个$i$),前缀和维护,查rank的时候不断查$C[x]$并二分下去,和平衡树就类似了。有点难讲,不过真的很好理解。

    没了。

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<queue>
     7 #define dbg(x) cerr<<#x<<" = "<<x<<endl
     8 #define _dbg(x,y) cerr<<#x<<" = "<<x<<"   "<<#y<<" = "<<y<<endl
     9 using namespace std;
    10 template<typename T>inline char MIN(T&A,T B){return A>B?A=B,1:0;}
    11 template<typename T>inline char MAX(T&A,T B){return A<B?A=B,1:0;}
    12 template<typename T>inline T _min(T A,T B){return A<B?A:B;}
    13 template<typename T>inline T _max(T A,T B){return A>B?A:B;}
    14 template<typename T>inline T read(T&x){
    15     x=0;char c;int f=0;while(!isdigit(c=getchar()))if(c=='-')f=1;
    16     while(isdigit(c))x=x*10+(c&15),c=getchar();return f?x=-x:x;
    17 }
    18 const int N=100000+7;
    19 int C[N],a[N];
    20 int n;
    21 #define lowbit(x) x&(-x)
    22 inline void Update_add(int x,int k){for(;x<=n;x+=lowbit(x))C[x]+=k;}
    23 inline int Query_sum(int x){int ret=0;for(;x;x-=lowbit(x))ret+=C[x];return ret;}
    24 inline int Query_kth(int x){
    25     int i=1<<__lg(n);
    26     while((lowbit(i))^1){
    27         if(x<=C[i])i-=((lowbit(i))>>1);
    28         else x-=C[i],i+=((lowbit(i))>>1);
    29         while(i>n)i-=((lowbit(i))>>1);
    30     }
    31     return C[i]^x?i+1:i;
    32 }
    33 
    34 int main(){//freopen(".in","r",stdin);freopen(".out","w",stdout);
    35     read(n);a[1]=1;
    36     for(register int i=2;i<=n;++i)read(a[i]),++a[i];
    37     for(register int i=1;i<=n;++i)C[i]=lowbit(i);
    38     for(register int i=n;i;--i){
    39         int x=Query_kth(a[i]);
    40         Update_add(x,-1),a[i]=x;
    41     }
    42     for(register int i=1;i<=n;++i)printf("%d
    ",a[i]);
    43     return 0;
    44 }
  • 相关阅读:
    TensorFLow手写字识别深度学习网络分析详解
    使用MSBUILD 构建时出错 error MSB3086: 任务未能使用 SdkToolsPath“”或注册表项“XXX”找到“LC.exe”,请确保已设置 SdkToolsPath。
    解决Win7启动时出现“windows未能启动。原因可能是最近更改了硬件或软件”的问题
    SSH安装篇之——SecureCRT连接(内网和外网)虚拟机中的Linux系统(Ubuntu)
    git push 冲突
    ubuntu快捷键收集
    ubuntu中wine下安装QQ
    ubuntu下安装无线网卡去驱动Qualcomm-Atheros-QCA9377
    spring mvc添加静态资源访问时@Controller无效的解决
    git更新到远程服务器代码
  • 原文地址:https://www.cnblogs.com/saigyouji-yuyuko/p/11409350.html
Copyright © 2011-2022 走看看