逆序对数=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)$

 #pragma GCC optimize(3)
#include<bits/stdc++.h>
#define pa pair<ll,ll>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=; inline char gc(){
return getchar();
static const int maxs=<<;static char buf[maxs],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,maxs,stdin),p1==p2)?EOF:*p1++;
}
inline ll rd(){
ll x=;char c=gc();bool neg=;
while(c<''||c>''){if(c=='-') neg=;c=gc();}
while(c>=''&&c<='') x=(x<<)+(x<<)+c-'',c=gc();
return neg?(~x+):x;
} int N,a[maxn];
int tr[maxn]; inline int lowbit(int x){return x&(-x);}
inline void add(int x,int y){
for(;x<=N;x+=lowbit(x)) tr[x]+=y;
}
inline int query(int x){
int re=;for(;x;x-=lowbit(x)) re+=tr[x];return re;
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd();
for(i=;i<=N;i++) a[i]=rd();
int num=;
for(i=;i<=N;i++){
num+=i--query(a[i]);
add(a[i],);
}
printf("%d\n",*(num/)+(num&));
return ;
}

最新文章

  1. 跳过IE10安装VS2013
  2. 可分组的选择框控件(MVVM下)(Toggle样式 仿造单选框RadioButton,复选框CheckBox功能)
  3. 第六百零七八天 how can I 坚持
  4. H5常用代码:适配方案2
  5. vim备忘
  6. Solr字段配置错误
  7. getattr的作用是什么呢
  8. ceph
  9. jmeter测试手机app
  10. 杭电ACM2011-- 多项式求和
  11. UIButton 使用imageEdgeInsets和titleEdgeInsets属性
  12. Sublime Text 3安装与使用 Package Control 插件安装
  13. android studio 报错,google后无果
  14. linux OSI七层模型、TCP/IP协议栈及每层结构大揭秘
  15. 2.5 elif
  16. 集合和format
  17. Filter—过滤器
  18. Java将List&lt;T&gt;集合组装成树(Tree)树结构组装
  19. vue的面包屑导航组件
  20. Week3 Teamework from Z.XML-团队分工及贡献分分配办法

热门文章

  1. PHP之CLI模式
  2. [转帖]Windows 10新预览版上线:可直接运行任意安卓APP了
  3. LLVM的安装
  4. Spring Boot(1)——开发你的第一款Spring Boot应用(Edition1)
  5. python之路--关于线程的一些方法
  6. spring程序打包war,直接通过-jar启动,并指定spring.profiles.active参数控制多环境配置
  7. vue element-ui 绑定@keyup事件无效
  8. JQ获取URL中是否含有某个字符的话,对页面进行某种操作
  9. 四、docker compose
  10. Clover file list