题意:
int steps = 0;
while (true) {
++steps;
bool isSorted = true;
for (int i = 1; i < N; ++i)
if (A[i] > A[i + 1]) {
swap(A[i], A[i + 1]);
isSorted = false;
}
if (isSorted) break;
}
给出长度为n的序列a 求将序列a做冒泡排序时,总共需要多少轮(stpe). n<=1e5,a[i]<=1e9.
设c[i]为i左边比i大的数 如果每个i 都有c[i]=0 则序列为排好序的
对每个c[i]>0 都会在一轮冒泡排序中减小1,因为i和左边比它大并且是最大的交换了一次.
则总轮数为最大的c[i] 可以用树状数组求出c[i].
因为只要求出c[i]的最大值.若i右有比a[i]小的数a[j],则c[j]>c[i] c[i]不可能为最小
int steps = 0;
while (true) {
++steps;
bool isSorted = true;
for (int i = 1; i < N; ++i)
if (A[i] > A[i + 1]) {
swap(A[i], A[i + 1]);
isSorted = false;
}
if (isSorted) break;
}
给出长度为n的序列a 求将序列a做冒泡排序时,总共需要多少轮(stpe). n<=1e5,a[i]<=1e9.
设c[i]为i左边比i大的数 如果每个i 都有c[i]=0 则序列为排好序的
对每个c[i]>0 都会在一轮冒泡排序中减小1,因为i和左边比它大并且是最大的交换了一次.
则总轮数为最大的c[i] 可以用树状数组求出c[i].
因为只要求出c[i]的最大值.若i右有比a[i]小的数a[j],则c[j]>c[i] c[i]不可能为最小
满足最大的必要条件为 i右边没有比它小的数,则a[i]左边为 全部比它小的数(排好序的下标-1)和比它大的数(c[i]个).
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5,M=1e6+5;
int n;
struct node{
int x,id,pos;
}a[N];
bool cmp(node a,node b)
{
if(a.x==b.x)
return a.id<b.id;
return a.x<b.x;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i].x),a[i].id=i;
sort(a+1,a+1+n,cmp);
int ans=0;
for(int i=1;i<=n;i++)
{
if(a[i].id<=i-1)
continue;
int c=a[i].id-(i-1)-1;
ans=max(ans,c);
}
ans++;
cout<<ans<<endl;
return 0;
}