lost cows

Posted sos3210

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lost cows相关的知识,希望对你有一定的参考价值。

这道题用树状数组做比较好,虽然树状数组能做的线段树也可以做到,但是树状数组更简洁方便,易操作

原理便是第x个数的二进制数最后一个“1”,决定tree的结点的长度

比如:

sum[3]=tree[3]+tree[2];

sum[4]=tree[4];

sum[5]=tree[5]+tree[4];

分割是位运算里的操作,一个数和它负数的补码(取反+1)用x&-x求得二进制数中为“1”的最小位

代码如下:

#include <iostream>
#include <cstdio>
#define lowbit(x) ((x)&-(x))
using namespace std;
const int MAX=10000;
int n;
int tree[MAX],pre[MAX],ans[MAX];


void add(int x,int d){//给x加d
while(x<=n){
tree[x]+=d;
x+=lowbit(x);
}
}

 

int sum(int x){
int ans=0;
while(x){
ans+=tree[x];
x-=lowbit(x);
}
return ans;
}


int findpos(int x){
int l=1,r=n;
while(l<r){
int mid=(l+r)>>1;
if(sum(mid)<x){
l=mid+1;
}
else{
r=mid;
}
}
return l;
}


int main()
{
scanf("%d",&n);
pre[1]=0;
for(int i=2;i<=n;i++){
scanf("%d",&pre[i]);
}
for(int i=1;i<=n;i++){//初始化不需要add()
tree[i]=lowbit(i);
}
for(int i=n;i>0;i--){
int x=findpos(pre[i]+1);
add(x,-1);
ans[i]=x;
}
for(int i=1;i<=n;i++){
printf("%d ",ans[i]);
}
return 0;
}

以上是关于lost cows的主要内容,如果未能解决你的问题,请参考以下文章

lost台词

Lost Cows

POJ2182 Lost Cows

POJ2182Lost Cows

Find the Lost Sock

Mysql连接在节点js中一段时间​​后关闭并给出PROTOCOL_CONNECTION_LOST'