【codeforces 749E】 Inversions After Shuffle

http://codeforces.com/problemset/problem/749/E (题目链接)

题意

  给出一个1~n的排列,从中等概率的选取一个连续段,设其长度为l。对连续段重新进行等概率的全排列,求排列后整个原序列的逆序对的期望个数。

Solution

  考虑对于每一对数${(a_i,a_j),i<j}$算贡献。


   1.连续段包含${a_i,a_j}$

  不妨设${a_i<a_j}$,则只有当排列后${a_j}$再${a_i}$前面才会对答案有贡献(${a_i>a_j}$的情况同理),连续段长度为${l}$。

  于是满足${a_i}$在${a_j}$前面的排列数为${P_l^{l-2}}$,概率:${\frac{P_l^{l-2}}{P_l^l}=\frac{1}{2}}$。

  满足包含${a_i}$和${a_j}$的连续段有${i*(n-j+1)}$个,其概率为:${\frac{2*i*(n-j+1)}{n*(n+1)}}$。

  所以其期望等于两个概率相乘:

  $${q_{i,j}=\frac{i*(n-j+1)}{n*(n+1)}}$$

  这是${O(n^2)}$的,考虑优化。总期望:

  $${Q=\sum_{i=1}^n  \sum_{j=i+1}^n  q_{i,j}}$$

  $${Q=\sum_{i=1}^n  \sum_{j=i+1}^n  \frac{i*(n-j+1)}{n*(n+1)}}$$

  发现${(n-j+1)}$是连续的,于是就变成了:

  $${Q=\sum_{i=1}^n  \frac {i*(n-i)*(n-i+1)} {2*n*(n+1)}}$$

  这样复杂度就是${O(n)}$的了。


  2.连续段不同时包含${a_i,a_j}$

  如果${a_i<a_j}$,那么因为不被连续段同时包含,它们不会有机会改变相对位置,所以不会对答案做出贡献。考虑${a_i>a_j}$的情况。

  那么连续段可能取到的区间有:${[1,j-1],[i+1,n]}$。考虑到区间${[i+1,j-1]}$被算了2次,容斥一下,所以区间的概率:

  $${P_{i,j}=\frac  {(j-1)*j+(n-i)*(n-i+1)-(j-i-1)*(j-i)}  {n*(n+1)}}$$

  $${P_{i,j}=\frac  {(n^2+n)-(2*i+2*n*i)+2*i*j}  {n*(n+1)}}$$

  这个${P_{i,j}}$怎么快速求解呢,考虑逆序对这个东西。

  $${Q=\sum_{i=1}^n  \sum_{j=i+1}^n  \frac  {(n^2+n)-(2*i+2*n*i)+2*i*j}  {n*(n+1)}}$$

  设满足${a_j<a_i,j>i}$的${a_j}$的个数为${x}$,显然${x}$我们可以通过树状数组用求逆序对的方法${O(nlogn)}$的求出来,则:

  $${Q=\sum_{i=1}^n  \frac  {x*((n^2+n)-(2*i+2*n*i))  +  \sum_{j=i+1}^n 2*i*j}  {n*(n+1)}}$$

  那么现在${\sum_{j=i+1}^n 2*i*j}$怎么求呢。把${2*i}$提出去,那么就成了${2*i*\sum_{j=i+1}^n j}$我们用${y}$记录满足${a_j<a_i,j>i}$的${a_j}$的位置的和,也就是${\sum_{j=i+1}^n j}$,那么显然这个东西我们也是可以通过树状数组用求逆序对的方法${O(nlogn)}$的算出来的。则:

  $${Q=\sum_{i=1}^n  \frac  {x*((n^2+n)-(2*i+2*n*i))  +  2*i*y}  {n*(n+1)}}$$

  于是问题就${O(nlogn)}$的解决了。

细节

  mdzz不晓得哪里爆掉了还是精度问题,调了2天,最后莫名AC。。。

代码

// codeforces 749E
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 1<<30
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;const int maxn=100010;
LL c[maxn],s[maxn],n;
int a[maxn];
long double ans;int lowbit(int x) {return x&-x;
}
void add(LL *c,int x,LL val) {for (int i=x;i<=n;i+=lowbit(i)) c[i]+=val;
}
LL query(LL *c,int x) {LL res=0;for (int i=x;i;i-=lowbit(i)) res+=c[i];return res;
}void solve1() {   //区间包含long double Q=0;for (LL i=1;i<=n;i++)Q+=(long double)(i*(n-i)*(n-i+1))/2/n/(n+1);ans+=Q;
}
void solve2() {   //区间不包含long double Q=0;for (int i=n;i>=1;i--) {LL x=query(c,a[i]-1);Q-=(long double)(x*((2*i+2*n*i)-(n*n+n)))/n/(n+1);Q+=(long double)(2*i)/n/(n+1)*query(s,a[i]-1);add(c,a[i],1);add(s,a[i],i);}ans+=Q;
}
int main() {scanf("%lld",&n);for (int i=1;i<=n;i++) scanf("%d",&a[i]);solve1();solve2();printf("%.20Lf",ans);return 0;
}

贴一个暴力,供参考:

// codeforces 749E
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 1<<30
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;const int maxn=100010;
LL c[maxn],s[maxn],n;
int a[maxn];
long double ans;int main() {freopen("aaa.in","r",stdin);freopen("ccc.out","w",stdout);scanf("%lld",&n);for (int i=1;i<=n;i++) scanf("%d",&a[i]);for (LL i=1;i<=n;i++)ans+=(long double)(i*(n-i)*(n-i+1))/(2*n*(n+1));long double res=0;for (LL i=n;i>=1;i--) {for (LL j=i+1;j<=n;j++)if (a[i]>a[j]) res+=(long double)((j-1)*j+(n-i)*(n-i+1)-(j-i-1)*(j-i))/(n*(n+1));}ans+=res;printf("%.20Lf",ans);return 0;
}

 

转载于:https://www.cnblogs.com/MashiroSky/p/6246624.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/417459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(2229):react条件渲染实现登录

index.js import React from react; import ReactDOM from react-dom;function UserGree(props) {return ( < h1 > 欢迎登陆 < /h1>)}function UserLogin(props) {return ( < h1 > 请先登陆 < /h1>)}class ParentCom extends React.Component {constr…

log4net 配置

AssemblyInfo.cs 添加[assembly: log4net.Config.XmlConfigurator(ConfigFile"log4net.config")]web根目录下log4net.config<?xml version"1.0" encoding"utf-8" ?><log4net><appender name"RollingLogFileAppender"…

csv mysql_将csv的数据导入mysql

手头有一份8MB的CSV文件需要分析&#xff0c;对于程序员来说&#xff0c;还有比在数据库里分析更愉快的事情吗&#xff1f;所以让我们把CSV导入MYSQL吧。一、首先按照文件列数创建相应的SQL表例如&#xff1a;DROP TABLE IF EXISTS cdr;CREATE TABLE cdr (direction varchar(25…

前端学习(2230):react条件渲染实现登录二

import React from react; import ReactDOM from react-dom;function UserGree(props) {return ( < h1 > 欢迎登陆 < /h1>)}function UserLogin(props) {return ( < h1 > 请先登陆 < /h1>)}class ParentCom extends React.Component {constructor(prop…

c c++互相调用

http://www.cppblog.com/franksunny/archive/2007/11/29/37510.html http://www.tuicool.com/articles/vuymUz转载于:https://www.cnblogs.com/chencesc/p/6248419.html

VS2010测试工具对应LoadTest2010创建sql

C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\loadtestresultsrepository.sql

前端学习(2231):react条件渲染之列表渲染

import React from react; import ReactDOM from react-dom; let arr [小明, 小红, 小花] let arrHtml [ < li > 小明 < /li>,<li>小红</li > ] class Welcome extends React.Component {constructor(props) {super(props)this.state {isLogin: tru…

哪里有mysql认证_国内哪个城市可以考mysql认证

学习完成该课程&#xff0c;你将能够&#xff1a;- 设计优化策略- 具备有关MySQL架构的知识- 获得使用诊断工具的知识和能力- 获得使用优化工具的知识和能力- 使用INFORMATION_SCHEMA数据库编写查询并获得元数据- 了解关系数据库模型以及影响性能的积极和消极的关联因素- 列示、…

SurvivalShooter学习笔记(八.敌人管理器)

敌人管理器&#xff1a;管理敌人的随机出生点创建 在场景中建立几个空物体&#xff0c;作为敌人的出生点 public class EnemyManager : MonoBehaviour{public PlayerHealth playerHealth; // 玩家生命脚本public GameObject enemy; // 敌人物体预制&#…

Axure在SVN共享项目如何获取历史文件

可能好用的方法 共享——浏览共享项目历史——获取历史选中之前的签入记录&#xff0c;点击下边的“导出为RP文件” 但我这里的Axure5.6会报错 解决方法 只能用SVN获取历史版本&#xff0c;然后压缩成zip&#xff0c;改名为*.rp再打开即可。

mysql varchar 长度限制_MySQL数据库varchar的限制规则说明

MySQL数据库中varchar最大长度是多少&#xff1f;其实这不是一个固定的数字&#xff0c;varchar的长度是有限制规则的。本文我们就来介绍一下MySQL数据库中varchar的限制规则&#xff0c;并以一个实际的例子对限制规则进行了说明&#xff0c;接下来就让我们一起来了解一下这部分…

丘吉尔与数据分析

数据分析已经存在有相当长一段时间了。早在二战期间&#xff0c;它便是同盟国胜利的关键因素之一。同盟国数据分析活动著名的例子&#xff0c;包括破译Enigma密码避免德军潜艇攻击、使用喷火式战斗机拍摄的2D图片重构3D图像&#xff0c;帮助英国皇家空军的情报人员分析如何在霸…

C#图片按指定大小分割

/// <summary>/// 切割一张指定的图片/// </summary>/// <param name"source">指定的图片源</param>/// <param name"tileWidth">图块宽度</param>/// <param name"tileHeight">图块高度</param&g…

前端学习(2233):react的子传父数据传递

import React from react; import ReactDOM from react-dom;import ./App.css class ParentCom extends React.Component {constructor(props) {super(props)this.state {childData: null}}render() {return ( <div ><h1 > 子元素传递给父级 { this.state.childDa…

mysql 错误问题_Mysql常见的几个错误问题及解决方法:

Mysql常见的几个错误问题及解决方法&#xff1a;1.问题&#xff1a; mysql DNS反解&#xff1a;skip-name-resolve错误日志有类似警告&#xff1a;点击(此处)折叠或打开120119 16:26:04 [Warning] IP address 192.168.1.10 could not be resolved: Name or service not known12…

idea maven web工程明明添加了maven lib的依赖,但启动web容器时始终报No Class Found?...

idea maven web工程明明添加了maven lib的依赖&#xff0c;但启动web容器时始终报No Class Found? 很久没用idea搭新工程&#xff0c;最近自己想做个东西&#xff0c;冲心搭个web工程&#xff0c;jar包都用maven刷好了&#xff0c;而且也将jar包添加至web module的Dependences…

C#快速排序

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace SortTry{public class QuickSort{/// <summary>/// 排序/// </summary>/// <param name"numbers">待排序数组</param>/// <param name&qu…

mysql identity sql_SQL Server中identity(自增)的用法详解

一、identity的基本用法1.含义identity表示该字段的值会自动更新&#xff0c;不需要我们维护&#xff0c;通常情况下我们不可以直接给identity修饰的字符赋值&#xff0c;否则编译时会报错2.语法列名 数据类型 约束 identity(m,n)m表示的是初始值&#xff0c;n表示的是每次自动…

C# CSV文件读取(带换行单元格中内容处理)

//读取内容StringBuilder sbContent new StringBuilder();using (StreamReader sr new StreamReader(Application.StartupPath "/content.txt")){string line;while ((line sr.ReadLine()) ! null){//双引号开头&#xff0c;中间处理换行if (line.Length > 0 …

上传文件至数据库并下载

在FineReport中&#xff0c;会出现希望直接将txt、excel等文件整个保存在数据库中进行备份&#xff0c;并且希望通过FineReport制作报表将这些文件下载下来的情况。 上传&#xff1a;使用文件控件上传文件&#xff0c;以二进制流保存至数据库字段中&#xff08;字段类型必须是用…