逆序对数=0的时候,这个数列是有序的
然后交换相邻的,看哪个比较大,逆序对数会加1或减1
Jeff用的是最优策略所以他肯定让逆序对数-1
设f[i]表示Jeff操作前,逆序对数为i,最终的期望次数
那就有$f[i]=0.5f[i-2]+0.5f[i]+2$
以及$f[1]=1,f[0]=0$
可以得出$f[i]=4*floor(i/2)+(i&1)$
1 #pragma GCC optimize(3) 2 #include<bits/stdc++.h> 3 #define pa pair<ll,ll> 4 #define CLR(a,x) memset(a,x,sizeof(a)) 5 using namespace std; 6 typedef long long ll; 7 const int maxn=3050; 8 9 inline char gc(){ 10 return getchar(); 11 static const int maxs=1<<16;static char buf[maxs],*p1=buf,*p2=buf; 12 return p1==p2&&(p2=(p1=buf)+fread(buf,1,maxs,stdin),p1==p2)?EOF:*p1++; 13 } 14 inline ll rd(){ 15 ll x=0;char c=gc();bool neg=0; 16 while(c<'0'||c>'9'){if(c=='-') neg=1;c=gc();} 17 while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=gc(); 18 return neg?(~x+1):x; 19 } 20 21 int N,a[maxn]; 22 int tr[maxn]; 23 24 inline int lowbit(int x){return x&(-x);} 25 inline void add(int x,int y){ 26 for(;x<=N;x+=lowbit(x)) tr[x]+=y; 27 } 28 inline int query(int x){ 29 int re=0;for(;x;x-=lowbit(x)) re+=tr[x];return re; 30 } 31 32 int main(){ 33 //freopen("","r",stdin); 34 int i,j,k; 35 N=rd(); 36 for(i=1;i<=N;i++) a[i]=rd(); 37 int num=0; 38 for(i=1;i<=N;i++){ 39 num+=i-1-query(a[i]); 40 add(a[i],1); 41 } 42 printf("%d ",4*(num/2)+(num&1)); 43 return 0; 44 }