谜一样的牛
暴力枚举:
牛的数量 | 比其他牛高 | 编号 |
---|---|---|
2 | 1 | 1 |
3 | 2 | 2 |
2 | 1 | 3 |
1 | 0 | 4 |
玄学~
全排列?
至少
nlog(n)
从后往前
智取时间
bool
变量开始设为1
二分区间?
// Init
// add(1~n)
主函数
// Main
const int N = 200010;
int n,h[N],t[N],ans[N];
int main(){
cin>>n;
for(int i=2;i<=n;i++) cin>>h[i];
for(int i=1;i<=n;i++) t[i]=lowbit(i);
for(int i=n;i;i--){
int k=h[i]+1;
int l=1,r=n;
while(l<r){
int mid=(l+r)/2;
if(sum(mid)>=k) r=mid;
else l=mid+1;
}
add(r,-1);
ans[i]=r;
}
for(int i=1;i<=n;i++){
cout<<ans[i]<<endl;
}
}
树状数组代码
// 模板2
int lowbit(int x){
return x&-x;
}
void add(int x,int k){
for(int i=x;i<=n;i+=lowbit(i)){
t[i]+=k;
}
}
int sum(int x){
int ans=0;
for(int i=x;i;i-=lowbit(i)){
ans+=t[i];
}
return ans;
}
完全代码
#include<bits/stdc++.h>
using namespace std;
// 模板
const int N = 200010;
int n,h[N],t[N],ans[N];
int lowbit(int x){
return x&-x;
}
void add(int x,int k){
for(int i=x;i<=n;i+=lowbit(i)){
t[i]+=k;
}
}
int sum(int x){
int ans=0;
for(int i=x;i;i-=lowbit(i)){
ans+=t[i];
}
return ans;
}
// Main
int main(){
cin>>n;
add(1,1);
for(int i=2;i<=n;i++){
cin>>h[i];
add(i,1);
}
for(int i=n;i;i--){
int k=h[i]+1;
int l=1,r=n;
while(l<r){
int mid=(l+r)/2;
if(sum(mid)>=k) r=mid;
else l=mid+1;
}
ans[i]=r;
add(r,-1);
}
for(int i=1;i<=n;i++){
cout<<ans[i]<<endl; //正着输出
}
}