Link

题意:给定一个 \(1\) 到 \(n\) 的排列,等概率选一段区间 \([l, r]\) 随机排序,求期望逆序对数。

\[E =
\dfrac{\sum(cnt_{[1, n]} - cnt_{[l, r]} + E_{len})}{\dfrac{n \times (n + 1)}{2}}
\]

\(cnt_{[l, r]}\) 表示原序列 \([l, r]\) 内部逆序对数。

\(E_{len}\) 表示长度为 \(r - l + 1\) 的排列随机排序后的期望逆序对。

\(E_i\) 怎么求?(直接oeis,啪的一下很快啊

\[E_i = \dfrac{i \times (i - 1)}{4}
\]

proof:

随机排序后,下标 \(i\),\(j\) 有 \(\dfrac{1}{2}\) 的概率构成逆序对,所以总期望为 \((i, j)\) 对数乘 \(\dfrac{1}{2}\)。

因此

\[\begin{aligned}
E =&
cnt_{[1, n]} - \dfrac{\sum cnt_{[l, r]}}{\dfrac{n \times (n + 1)}{2}} + \dfrac{\sum_{i = 1}^n (n - i + 1) \times E_i}{\dfrac{n \times (n + 1)}{2}} \\
=&
cnt_{[1, n]} - \dfrac{2\sum cnt_{[l, r]}}{n \times (n + 1)} + \dfrac{\sum_{i = 1}^n (n - i + 1) \times i \times (i - 1)}{2 \times n \times (n + 1)} \\
=&
A + \dfrac{-2B + \dfrac{C}{2}}{n \times (n + 1)}

\end{aligned}
\]

\(A\),\(C\) 都很好做。

对于 \(B\),下标为 \(j, i\) 的逆序对对 \(B\) 的贡献为包含 \([j, i]\) 的所有区间数 \(j \times (n - i + 1)\),树状数组维护 \(\sum j\) 即可。

#include<bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i <= (b); ++ i)
#define per(i, a, b) for(int i = (a); i >= (b); -- i)
using namespace std;
using ll = long long;
constexpr int N = 1e5 + 5; struct Fenwick_Tree {
ll t[::N], n;
void init(int x) {
for(int i = 1; i <= (n = x); ++ i) {
t[i] = 0;
}
}
void add(int p, ll v = 1) {
while(p) {
t[p] += v;
p -= p & -p;
}
}
ll suf(int p) {
ll ret = 0;
while(p <= n) {
ret += t[p];
p += p & -p;
}
return ret;
}
} bit; ll n, a[N], A, B, C; /*
长度为n的排列的期望逆序对数为 n * (n - 1) / 4
https://oeis.org/A001809
*/ int main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
cin >> n, bit.init(n);
for(int i = 1; i <= n; ++ i) {
cin >> a[i];
A += bit.suf(a[i]);
bit.add(a[i]);
}
bit.init(n);
for(int i = 1; i <= n; ++ i) {
B += ll(n - i + 1) * bit.suf(a[i]);
bit.add(a[i], i);
}
B *= 2;
for(int i = 1; i <= n; ++ i) C += ll(n - i + 1) * i * (i - 1);
C /= 2;
double E = A + (double)(-B + C) / (n * (n + 1));
cout << fixed << setprecision(12) << E;
return 0;
}

CF746 期望+逆序对的更多相关文章

  1. 计数 luogu 4223 期望逆序对

    https://www.luogu.org/problemnew/show/P4223 期望乘以\(\binom {n}{2}^k\)变成了计数问题 我们考虑每一组数\((A, B)\)产生的贡献CC ...

  2. BZOJ5058 期望逆序对 【矩乘 + 组合数学 + 树状数组】

    题目链接 BZOJ5058 题解 可以发现任意两个位置\(A,B\)最终位置关系的概率是相等的 如果数列是这样: CCCCACCCCBCCCC 那么最终有\(7\)种位置关系 \((A,B)\) \( ...

  3. Wannafly Camp 2020 Day 1A 期望逆序对 - 概率期望

    分类讨论即可 #include <bits/stdc++.h> using namespace std; #define int long long const int N = 5005; ...

  4. 逆序对 inversion

      评测传送门 [问题描述] 有一个1 − n的排列,你会依次进行m次操作,第i次操作表示为(x i , y i ),交换以这两个 值为下标的元素,每次操作有一半的概率成功,你需要求出最后序列的逆序对 ...

  5. Codeforces 351B Jeff and Furik:概率 + 逆序对【结论题 or dp】

    题目链接:http://codeforces.com/problemset/problem/351/B 题意: 给你一个1到n的排列a[i]. Jeff和Furik轮流操作,Jeff先手. Jeff每 ...

  6. 【CQOI2011】动态逆序对 BZOJ3295

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

  7. CH Round #72 奇数码问题[逆序对 观察]

    描述 你一定玩过八数码游戏,它实际上是在一个3*3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3*3的网格中. 例如:5 2 81 3 _4 6 7 在游戏过程中,可以把空格与其上 ...

  8. POJ3928Ping pong[树状数组 仿逆序对]

    Ping pong Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3109   Accepted: 1148 Descrip ...

  9. NOIP2013火柴排队[逆序对]

    题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...

  10. bzoj 3295 动态逆序对 CDQ分支

    容易看出ans[i]=ans[i-1]-q[i],q[i]为删去第i个数减少的逆序对. 先用树状数组算出最开始的逆序对,预处理出每个数前边比它大的和后边比它小的,就求出了q[i]的初始值. 设b[i] ...

随机推荐

  1. Oracle 已存在数据的大表 改 分区表

    创建表,插入测试数据 -- Create table create table LXW_TEST ( CDATE DATE, T1 NUMBER, T2 VARCHAR2(2) ) ; insert ...

  2. MySQL连接数超出最大值报错及修改

    报错: create connection SQLException, url: jdbc:mysql://xx.xxx.x.xx:6306/hksk-cloud-mes?characterEncod ...

  3. KingbaseES V8R6 集群运维系列 -- trusted_server

    案例说明: 在KingbaseES V8R3及V8R6早期的版本,对于读写分离的集群如果网关地址无法连通,将会导致整个集群关闭,数据库服务无法访问.在后期版本的改进中,降低了对网关的依赖性,当网关地址 ...

  4. KingbaseES V8R6集群运维系列 -- connect_check_type参数

    案例说明: 在KingbaseES V8R6C7的版本中,repmgr.conf增加了connect_check_type参数可以指定参数值,默认值是'mix',以前版本为隐藏参数,默认值'ping' ...

  5. KingbaseES V8R6 数据库运维案例之 -- root用户securecmd连接'Permission denied'错误

    案例分析: 在KingbaseES V8R6数据库在不支持ssh连接的系统环境,可以通过securecmdd服务建立主机之间的通讯,默认securecmdd服务建立用户之间的互信,通过publicke ...

  6. KingbaseES V8R6 集群运维系列--sys_monitor.sh stop关闭集群分析

    案例说明: 对于KingbaseES V8R6集群关闭整个集群通过执行'sys_monitor.sh stop'命令完成,本案例解析了在执行'sys_monitor.sh stop'后,数据库的关闭方 ...

  7. kafka集群启动命令脚本文件kf.sh

    注意代码缩进 添加执行权限 chmod +x kf.sh 1 #! /bin/bash 2 case $1 in 3 "start"){ 4 for i in hadoop102 ...

  8. sql语句TRUNCATE 清空表数据

    清空表数据 TRUNCATE TABLE zzsfp_hwmx;

  9. Python---flask框架实现清除cookies功能

    路由部分: 1 #用户退出清理cookie 2 @app.route('/clean_cookies',methods=['GET', 'POST']) 3 def clean_cookies(): ...

  10. #贪心#洛谷 6927 [ICPC2016 WF]Swap Space

    题目 分析 可以发现能将硬盘容量变大的优先,这种硬盘就是以格式化前的大小升序排序. 然后如果硬盘容量变小,那就是先填格式化后较大的硬盘(因为装完可以提供较大的空间) 代码 #include <c ...