题目描述:
双向冒泡,问几次能够排好
题目分析:
先把数组排序,对于每个位置,求一下排完序后有多少个数不在前i个了
取Max即为答案
为什么呢
冒泡排序就是交换
对于(i-i+1)这个分割线,我们每一次冒泡会让一个不属于前面的到后面去,同时让一个不属于后面的到前面来,每一次能够让这个数-1,那么取Max即为答案
题目链接:
Ac 代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#define lowbit(x) ((x&(-x)))
const int maxm=110000;
struct node{
int val,id;
}a[maxm];
int sum[maxm],n;
inline bool comp(node x,node y)
{
return x.val<y.val;
}
inline void ins(int x)
{
for(int i=x;i<=maxm;i+=lowbit(i))
sum[i]++;
}
inline int ask(int x)
{
int res=0;
for(int i=x;i;i-=lowbit(i))
res+=sum[i];
return res;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i].val),a[i].id=i;
std::sort(a+1,a+n+1,comp);
int ans=0;
for(int i=1;i<=n;i++)
{
ins(a[i].id);
ans=std::max(ans,i-ask(i));
}
printf("%d\n",std::max(ans,1));
return 0;
}