P4375 [USACO18OPEN]Out of Sorts G 题解
Otomachi_Una_ · · 题解
一道珂爱并且喵喵的可爱题。
题目简述
- 求双重冒泡排序循环次数。
-
题目分析
我们先说结论,假设
我们证明一下。
这个式子其实就是在
每一次如果
那么排序,就是要对任意的
参考代码
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=1e5+5;
int n;
struct node{
int val,id;
}a[MAXN];
bool cmp1(node x,node y){return ((x.val!=y.val)?x.val<y.val:x.id<y.id);}
bool cmp2(node x,node y){return x.id<y.id;}
int t[MAXN];
int lowbit(int x){
return x&(-x);
}
void add(int x){
while(x<=n){
t[x]++;
x+=lowbit(x);
}
}
int que(int x){
int res=0;
while(x>0){
res+=t[x];
x-=lowbit(x);
}
return res;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i].val,a[i].id=i;
sort(a+1,a+n+1,cmp1);
for(int i=1;i<=n;i++)
a[i].val=i;
sort(a+1,a+n+1,cmp2);
int ans=1;
for(int i=1;i<=n;i++){
add(a[i].val);
ans=max(ans,i-que(i));
}
cout<<ans<<endl;
}