博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CC-SEABUB]Sereja and Bubble Sort
阅读量:6860 次
发布时间:2019-06-26

本文共 1857 字,大约阅读时间需要 6 分钟。

[CC-SEABUB]Sereja and Bubble Sort

题目大意:

一个\(n(n\le100)\)个数的排列\(A\),有两种操作:

  1. 交换两个相邻元素;
  2. 等概率随机打乱整个序列。

最多执行\(k(k\le10^{18})\)次操作,使得最后逆序对数量尽可能小,求最后逆序对数量期望值。

单个测试点\(T(T\le100)\)组数据。

思路:

一个基本性质是每交换两个相邻元素都可以消去一个逆序对。

一组询问的答案要么是直接通过交换消去所有的逆序对,要么是通过若干次随机打乱以后再通过交换相邻元素消去逆序对。

对于第一种情况,直接求逆序对即可。答案为\(\min(cnt-k,0)\)

对于第二种情况,显然打乱以后的排列与\(A\)本身无关,因此考虑动态规划预处理所有答案。

\(f[i][j][k]\)表示排列的长度为\(i\),有\(j\)个逆序对,再经过不超过\(k\)次操作后,逆序对个数的期望。

\(g[i][j]\)表示排列的长度为\(i\),再经过不超过\(j\)次操作后,逆序对个数的期望。

\(h[i][j]\)表示排列的长度为\(i\),逆序对个数为\(j\)的概率。

转移是\(g[i][j]=\sum f[i][k][j]\times h[i][k]\)

考虑不同取值的\(k\)如何转移。

  1. \(k\le j\),在\(j\)步操作内就可以消去所有的逆序对,贡献为\(0\)
  2. \(j<k\le\lfloor j+g[i][j-1]\rfloor\),尽可能地交换,就算不能消去全部,期望也比打乱以后更优。贡献是\(\sum h[i][k]\times(k-j)\)
  3. 剩下的情况,重新打乱更优,贡献为\(g[i][j-1]\)

使用前缀和优化即可。

预处理复杂度\(\mathcal O(n^4)\),单次询问复杂度\(\mathcal O(n\log n)\)

源代码:

#include
#include
#include
typedef long long int64;inline int64 getint() { register char ch; while(!isdigit(ch=getchar())); register int64 x=ch^'0'; while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); return x;}const int N=101,M=4951;int64 k;int n,a[N];double f[N][M],h[N][M],g[N][M];class FenwickTree { private: int val[N]; int lowbit(const int &x) const { return x&-x; } public: void reset() { std::fill(&val[1],&val[n]+1,0); } int query(int p) const { int ret=0; for(;p;p-=lowbit(p)) ret+=val[p]; return ret; } void modify(int p) { for(;p<=n;p+=lowbit(p)) val[p]++; }};FenwickTree t;inline int calc() { int ret=0; t.reset(); for(register int i=n;i>=1;i--) { ret+=t.query(a[i]); t.modify(a[i]); } return ret;}int main() { h[1][0]=1; for(register int i=2;i

转载于:https://www.cnblogs.com/skylee03/p/9432709.html

你可能感兴趣的文章
phpcms导航栏多个栏目调用
查看>>
人脸识别 参考 转盒子
查看>>
SDUT OJ 顺序表应用2:多余元素删除之建表算法
查看>>
CSS
查看>>
Android笔记之为TextView设置边框
查看>>
【Lift】Scala Web 框架——Lift(一)准备工作
查看>>
【转载】增强学习(Reinforcement Learning and Control)
查看>>
GNU使用find命令
查看>>
java的执行与加载的过程
查看>>
8.2 sikuli 集成进eclipse 报错:Getting the VisionProxy.dll: Can not find dependent libraries......
查看>>
2.6.1 XML配置:创建XML文件
查看>>
第六天-数据分类型
查看>>
排版类
查看>>
Java中如何遍历Map对象
查看>>
iOS开发的技能树
查看>>
python 装饰器 回顾 及练习
查看>>
Flask学习之搭建环境
查看>>
为什么使用卷积?
查看>>
css盒模型不同浏览器下解释不同 解决办法
查看>>
Spring全家桶系列–[SpringBoot入门到跑路]
查看>>