冒泡需要的趟数
=
<script type="math/tex" id="MathJax-Element-41">=</script> 反序表最大值。
这题只有01两种数字,所以每次求最后的0前面有几个1就好了。
具体实现倒着搞比较好。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=300005;
int n,bit[maxn],_max,a[maxn],ans[maxn];
void Updata(int x,int val){
for(;x<=n;x+=(x&(-x))) bit[x]+=val;
}
int Query(int x){
int res=0;
for(;x;x-=(x&(-x))) res+=bit[x];
return res;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int _max=0;
for(int i=1;i<=n;i++) Updata(i,1);
for(int i=n;i>=1;i--){
ans[++ans[0]]=Query(_max)+1;
_max=max(_max,a[i]); Updata(a[i],-1);
}
ans[++ans[0]]=1;
for(int i=ans[0];i>=1;i--) printf("%d ",ans[i]);
return 0;
}