CF513G3 Inversions problem
考虑记\(f_{i,j,k}\)为\(k\)次操作后,\(i,j\)位置被调换的概率。
那么我们考虑枚举我们要算的答案即\((x,y)\)。
那么有\(\frac{n * (n + 1)}{2}\)种调换顺序。
以此分类讨论:
一:不相交:

对答案不产生影响。
二:包含

因为是反转操作,考虑枚举枚举翻转移动的距离,从\(f_{i + q,j + q,k - 1}\)转移过来。
三:端点相交

同样考虑枚举反转距离 ,从\(f_{i + q,j,k - 1}\)还有\(f_{i,j + q,k - 1}\)。
利用前缀和可以做到\(O(k n^2)\)。
由于是实数运算,所以在\(k\)增大的过程中,\(\Delta ans\to 0\),所以我们取一个数据范围能够容忍的大数\(k\)作为答案,实测\(k = 900\)效果很不错。
CF513G3 Inversions problem
// code by fhq_treap
#include<bits/stdc++.h>
#define ll int
#define N 200
inline ll read(){
char C=getchar();
ll A=0 , F=1;
while(('0' > C || C > '9') && (C != '-')) C=getchar();
if(C == '-') F=-1 , C=getchar();
while('0' <= C && C <= '9') A=(A << 1)+(A << 3)+(C - 48) , C=getchar();
return A*F;
}
ll n,k;
ll num[N];
double dp[N][N],tmp[N][N];
double calc(int x){return (double)(x) * (double)(x + 1) / 2;}
int main(){
scanf("%d%d",&n,&k);
for(int i = 1;i <= n;++i)
scanf("%d",&num[i]);
// for(int i = 1;i <= n;++i)
// for(int j = i + 1;j <= n;++j)
// dp[i][j] = 1.0;
k = std::min((ll)900,k);
double tot = (n + 1) * n / 2;
for(int m = 1;m <= k;++m){
for(int i = 1;i <= n;++i)
for(int j = 1;j <= n;++j)
tmp[i][j] = 0;
for(int i = 1;i <= n;++i)
for(int j = i + 1;j <= n;++j){
tmp[i][j] = dp[i][j] * (calc(i - 1) + calc(j - i - 1) + calc(n - j)) / tot;
// std::cout<<i<<" "<<j<<" "<<tmp[i][j]<<" "<<(calc(i - 1) + calc(j - i + 1) + calc(n - j))<<std::endl;
//i,j
for(int q = 1 - i;q + j <= n;++q)
tmp[i][j] += (1 - dp[i + q][j + q]) * std::min(std::min(i,i + q),n - std::max(j,j + q) + 1) / tot;
// std::cout<<i<<" "<<j<<" "<<tmp[i][j]<<std::endl;
//i
for(int q = 1 - i;q < j - i;++q)
tmp[i][j] += dp[i + q][j] * std::min(std::min(i,i + q),j - std::max(i,i + q)) / tot;
// std::cout<<i<<" "<<j<<" "<<tmp[i][j]<<std::endl;
//j
for(int q = i - j + 1;q + j <= n;++q)
tmp[i][j] += dp[i][j + q] * std::min(std::min(j,j + q) - i,n - std::max(j + q,j) + 1) / tot;
// std::cout<<i<<" "<<j<<" "<<tmp[i][j]<<std::endl;
}
std::memcpy(dp,tmp,sizeof(tmp));
// for(int i = 1;i <= n + 1;++i,puts(""))
// for(int j = i + 1;j <= n;++j)
// std::cout<<dp[i][j]<<' ';
}
double ans = 0.0;
for(int i = 1;i <= n;++i)
for(int j = i + 1;j <= n;++j){
if(num[i] < num[j])ans += dp[i][j];
else
ans += 1 - dp[i][j];
}
std::printf("%.10f",ans);
}
CF513G3 Inversions problem的更多相关文章
- Codeforces 513G1 513G2 Inversions problem [概率dp]
转自九野:http://blog.csdn.net/qq574857122/article/details/43643135 题目链接:点击打开链接 题意: 给定n ,k 下面n个数表示有一个n的排列 ...
- [UCSD白板题] Number of Inversions
Problem Introduction An inversion of a sequence \(a_0,a_1,\cdots,a_{n-1}\) is a pair of indices \(0 ...
- Rockethon 2015
A Game题意:A,B各自拥有两堆石子,数目分别为n1, n2,每次至少取1个,最多分别取k1,k2个, A先取,最后谁会赢. 分析:显然每次取一个是最优的,n1 > n2时,先手赢. 代码: ...
- Codeforces Round Rockethon 2015
A. Game 题目大意:A有N1个球,B有N2个球,A每次可以扔1-K1个球,B每次可以扔1-K2个球,谁先不能操作谁熟 思路:.....显然每次扔一个球最优.... #include<ios ...
- 《算法导论》Problem 2-4 Inversions
在Merge Sort的基础上改改就好了. public class Inversions { public static int inversions(int [] A,int p, int r) ...
- Dynamic Inversions II 逆序数的性质 树状数组求逆序数
Dynamic Inversions II Time Limit: 6000/3000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Other ...
- Dynamic Inversions 50个树状数组
Dynamic Inversions Time Limit: 30000/15000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others ...
- [Swift]LeetCode775. 全局倒置与局部倒置 | Global and Local Inversions
We have some permutation Aof [0, 1, ..., N - 1], where N is the length of A. The number of (global) ...
- [LeetCode] Global and Local Inversions 全局与局部的倒置
We have some permutation A of [0, 1, ..., N - 1], where N is the length of A. The number of (global) ...
随机推荐
- 【转】对于编译程序时出现“Deprecated declaration ultrasonic_Init - give arg types”的解决办法
编译程序时出现"Deprecated declaration ultrasonic_Init - give arg types"中文释义:给定函数的参数的类型过时, 解决办法: 在 ...
- 搭载Dubbo+Zookeeper踩了这么多坑,我终于决定写下这篇!
大家好,我是melo,一名大二上软件工程在读生,经历了一年的摸滚,现在已经在工作室里边准备开发后台项目啦. 这篇文章我们不谈数据结构了,来谈谈入门分布式踩过的坑.感觉到了分布式这一层,由于技术更新迭代 ...
- 《python编程:从入门到实践》课后习题及答案
转载: <Python编程:从入门到实践>课后习题及答案-码农之家 (xz577.com) <Python编程:从入门到实践>课后习题及答案 - 信德维拉 - 博客园 (cnb ...
- Java:反射小记
Java:反射小记 对 Java 中的 反射,做一个微不足道的小小小小记 概念 Java 反射指的是在 Java 程序运行状态中,对于任何一个类,都可以获得这个类的所有属性和方法:对于给定的一个对象, ...
- 2021北航敏捷软工Beta阶段评分与总结
概述 Beta 阶段评分,按照之前的规则,主要组成部分为: 博客部分,基于 Beta 阶段博客的评分(每篇正规博客 10 分,每篇 Scrum5 分,评定方式类比往年) 评审部分,基于 Beta 阶段 ...
- 关于qmake的install
在pro的构建系统中可以设置INSTALLS变量,在make命令之后,执行make install命令触发,将想要的资源拷贝到相应的目录,参考qwt的构建体系,在qwt.pro末尾有这么几句 qwts ...
- Netty:Netty的介绍以及它的核心组件(二)—— ChannelFuture与回调
Callback 回调 一个 Callback(回调)就是一个方法,一个提供给另一个的方法的引用. 这让另一个方法可以在适当的时候回过头来调用这个 callback 方法.Callback 在很多编程 ...
- linux updatedb: can not open a temporary file for `/var/lib/mlocate/mlocate.db'
我们想查找我们最新创建的文件时,由于locate的数据库是每天更新.所以我们新创建的文件还没有被更新到系统的数据库. 这是需要手动更新数据库. 然后就可以查到. updatedb 输出 updated ...
- XOR算法
原理 依据的是异或门 即同为0,异为1 0^0=0 0^1=1 1^0=1 1^1=0 对一个数据进行两次XOR运算会得到这个数据本身 所以加密时就将message和其对应的key进行一波XOR运算得 ...
- 用python写一个自动化盲注脚本
前言 当我们进行SQL注入攻击时,当发现无法进行union注入或者报错等注入,那么,就需要考虑盲注了,当我们进行盲注时,需要通过页面的反馈(布尔盲注)或者相应时间(时间盲注),来一个字符一个字符的进行 ...