题目

题目大意

有一个数列AAA,数列上的每个数都是在[li,ri][l_i,r_i][li​,ri​]范围内随机的数。

将这个数列进行稳定排序,得到每个位置在排序后的排名pip_ipi​。

f(A)=∑sipif(A)=\sum s_ip_if(A)=∑si​pi​,求E(f(A))E(f(A))E(f(A))。


思考历程

这种恶心的概率题根本就不知道该怎么思考好吗!

于是打了个暴力,就是枚举所有的情况,然后直接计算。

可是最后不知道为什么爆0了……


正解

E(f(A))=∑siE(pi)E(f(A))=\sum s_i E(p_i)E(f(A))=∑si​E(pi​)

所以我们只需要求出pip_ipi​的期望值就好了。

显然pi=∑j≤i∣aj≤ai∣+∑j&gt;i∣aj&lt;ai∣p_i=\sum_{j\leq i} |a_j \leq a_i|+\sum_{j&gt;i} |a_j&lt; a_i|pi​=∑j≤i​∣aj​≤ai​∣+∑j>i​∣aj​<ai​∣

左右两边是类似的,下面只考虑左边的情况。

设ai=xa_i=xai​=x。对于每个位置jjj,有三种情况:

1、当x&lt;ljx&lt;l_jx<lj​时,位置jjj作出的贡献为000。

2、当lj≤x≤rjl_j \leq x \leq r_jlj​≤x≤rj​时,位置jjj做出的贡献为x−li+1ri−li+1\frac{x-l_i+1}{r_i-l_i+1}ri​−li​+1x−li​+1​。

3、当x&gt;rjx&gt;r_jx>rj​时,位置jjj作出的贡献为111。

不解释……

可以将其转化成一个分段函数的图像来理解一下,前后两段都是与xxx轴平行的线,中间的那段是一段一次函数的图像。

将所有jjj的函数全部加起来,枚举xxx,就可以计算E(pi)E(p_i)E(pi​)。

接下来我们考虑的问题是如何将所有jjj的函数叠加起来,并且能够快速查询一段区间内的和。

在叠加之后,函数长得一定很奇怪……所以不能用数学方法。

考虑使用线段树,用线段树来维护这些东西。

现在有一个奇怪的操作,在线段树内的一段区间上加某段一次函数的图像。

换个说法就是给这段区间加上一个等差数列。

这个怎么维护呢?

我们发现最重要的一点就是标记,关键是如何维护标记。

合并标记的时候,两段一次函数的都在同一段区间内,仔细想想是可以合并的。

一次函数的普遍形式就是y=kx+by=kx+by=kx+b,合并起来之后就是y=(k1+k2)x+(b1+b2)y=(k_1+k_2)x+(b_1+b_2)y=(k1​+k2​)x+(b1​+b2​)。所以可以简单粗暴地相加。

这样维护标记的问题就解决了,整个区间的值都可以维护。

下一个问题就是如何快速地询问,直接维护和就好,在修改的时候加上等差数列的和(千万不要告诉我你不会等差数列求和)。

算法的核心就完成了。

所以我们维护一个这样的线段树,然后从左往右扫,将当前点的贡献(也就是那个分段函数)加入线段树当中,然后区间询问当前点取值范围这一区间内的和,计算E(pi)E(p_i)E(pi​)。

再从右往左扫,实际上是类似的。


代码

我才不会告诉你我先打了博客再打代码……

[JZOJ5232] 【NOIP2017模拟A组模拟8.5】带权排序的更多相关文章

  1. JZOJ 100029. 【NOIP2017提高A组模拟7.8】陪审团

    100029. [NOIP2017提高A组模拟7.8]陪审团 Time Limits: 1000 ms  Memory Limits: 131072 KB  Detailed Limits   Got ...

  2. JZOJ 5328. 【NOIP2017提高A组模拟8.22】世界线

    5328. [NOIP2017提高A组模拟8.22]世界线 (File IO): input:worldline.in output:worldline.out Time Limits: 1500 m ...

  3. JZOJ 5329. 【NOIP2017提高A组模拟8.22】时间机器

    5329. [NOIP2017提高A组模拟8.22]时间机器 (File IO): input:machine.in output:machine.out Time Limits: 2000 ms M ...

  4. JZOJ 5307. 【NOIP2017提高A组模拟8.18】偷窃 (Standard IO)

    5307. [NOIP2017提高A组模拟8.18]偷窃 (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Description ...

  5. JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 (Standard IO)

    5286. [NOIP2017提高A组模拟8.16]花花的森林 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Descript ...

  6. JZOJ 5305. 【NOIP2017提高A组模拟8.18】C (Standard IO)

    5305. [NOIP2017提高A组模拟8.18]C (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Description ...

  7. JZOJ 5230. 【NOIP2017模拟A组模拟8.5】队伍统计

    5230. [NOIP2017模拟A组模拟8.5]队伍统计 (File IO): input:count.in output:count.out Time Limits: 1500 ms Memory ...

  8. 【NOIP2017提高A组模拟9.17】信仰是为了虚无之人

    [NOIP2017提高A组模拟9.17]信仰是为了虚无之人 Description Input Output Sample Input 3 3 0 1 1 7 1 1 6 1 3 2 Sample O ...

  9. 【NOIP2017提高A组模拟9.17】猫

    [NOIP2017提高A组模拟9.17]猫 题目 Description 信息组最近猫成灾了! 隔壁物理组也拿猫没办法. 信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数) ...

  10. 【NOIP2017提高A组模拟9.17】组合数问题

    [NOIP2017提高A组模拟9.17]组合数问题 题目 Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数. 举个例子,将{1,2,3}拆分成2 个 ...

随机推荐

  1. 直接用编译器按ctrl+F5运行和双击运行结果不一样

    是因为进程权限的问题,需要添加下面的代码: BOOL EnableDebugPrivilege() { HANDLE hToken; BOOL fOk=FALSE; if(OpenProcessTok ...

  2. hexo next主题深度优化(十一),next主题中加入scrollReveal.js,让文章随着鼠标的滚动,出现点小动作。

    文章目录 效果 scrollReveal简单介绍以及简单操作 参考文档: next主题中加入scrollReveal 给article标签添加属性 给底部的不蒜子添加属性 本地引入依赖并且编写启动函数 ...

  3. LightOJ-1253-Misere Nim-nim博弈

    Alice and Bob are playing game of Misère Nim. Misère Nim is a game playing on k piles of stones, eac ...

  4. Codeforces 1167C - News Distribution

    题目链接:http://codeforces.com/problemset/problem/1167/C 题意:大概就是分成几个小团体,给每个人用1 - n编号,当对某个人传播消息的时候,整个小团体就 ...

  5. TortoiseGit配置私钥关联github

    1.使用Git 命令行生成公钥和私钥 找到Git安装目录(我的安装目录是  D:\DevelopSoft\Git),打开git-bash.exe. 输入命令 回车 ssh-keygen -t rsa ...

  6. Flutter 类似viewDidAppear 的任务处理

    前言 在任务之中 ,有些实时任务比较重的需求,需要在类似 iOS viewDidAppear 里面执行数据请求任务,如:上一个页面返回pop 后执行网络请求任务.在flutter中如何实现呢?  目前 ...

  7. 【第三周读书笔记】浅谈node.js中的异步回调和用js-xlsx操作Excel表格

    在初步学习了node.js之后,我发现他的时序问题我一直都很模糊不清,所以我专门学习了一下这一块. 首先我们来形象地理解一下进程和线程: 进程:CPU执行任务的模块.线程:模块中的最小单元. 例如:c ...

  8. 和Excel函数date同样功能的VBA函数DateSerial用法

    Sub 日期别()On Error Resume Nextlastrow = Sheets("运营日报").Range("a1048576").End(xlUp ...

  9. Java 学习 时间格式化(SimpleDateFormat)与历法类(Calendar)用法详解

    基于Android一些时间创建的基本概念 获取当前时间 方式一: Date date = new Date(); Log.e(TAG, "当前时间="+date); 结果: E/T ...

  10. Java迷宫代码,广度优先遍历,最短路径

    使用一个队列,采用层层扩张的方式,寻找迷宫最优的路径信息,再用一个迷宫节点数组记录行走信息方向常量定义: public interface Constant { // 右方向 int RIGHT = ...