题目传送门

题意简述:有 \(n\) 个数 \(a_1,a_2,\cdots a_n\),等概率选取区间 \(P_1,S_1\subseteq [1,n]\),\(P_2\subseteq P_1\),\(S_2\subseteq S_1\)。定义 \(f(X,Y)\) 为互不相同的 \(a_i\ (i\in X,a_i\in Y)\) 的个数,求 \(\Delta=F(P_1,S_1)-F(P_2,S_2)\) 的等权重平均,即所有可能方案的 \(\Delta\) 之和除以方案总数。

\(1\leq n,a_i\leq 5\times 10^5\)。


写在开头的一些定义:

下文中,定义 \(s_i\) 表示前 \(i\) 个正整数之和,即 \(\sum_{j=1}^ij\);定义 \(sq_i\) 表示前 \(i\) 个正整数的平方和,即 \(\sum_{j=1}^ij^2\)。


首先假设 \(a_i\) 互不相同,那么显然每个数对答案的贡献独立。对于第 \(i\) 个数 \(a_i\),我们单独讨论其贡献。

  • 先求 \(a_i\) 对 \(F(P_2,S_2)\) 的贡献:所有 \(i\in P_2,a_i\in S_2\) 的方案总数。

    不难发现对编号 \(i\) 的限制与对数值 \(a_i\) 的限制是独立的。那么根据乘法原理,它可以写成 \(f_2(i)\times g_2(a_i)\) 的形式,其中 \(f_2(i)\) 表示 \(i\in P_2\) 的方案总数,\(g_2(a_i)\) 表示 \(a_i\in S_2\) 的方案总数。同时,又因为 \(P_2\) 与 \(S_2\) 的定义相同,所以函数 \(f_2\) 与 \(g_2\) 等价,即 \(f_2=g_2\)。

    根据 \(f_2\) 和 \(S_2\) 的定义,\(f_2(i)\) 表示 \(i\in P_2\subseteq P_1\subseteq [1,n]\) 的总情况数。不妨反过来考虑,将其定义为在位置 \(i\) 两侧嵌套两层括号的总方案数。不难发现左右括号相互独立。先考虑左括号:当第一层左括号在 \(j\) 两侧时,第二层括号只能套在 \([1,j]\) 的左侧,即 \(\sum_{j=1}^ij\),即 \(s_j\)。同理可求得右括号的方案数为 \(s_{n-j+1}\)。

    实际上,我是先打表找出规律才想到了这个实际意义。

    这样我们就有了 \(f_2\) 的表达式,即 \(f_2(i)=s_is_{n-i+1}\)。由此推出 \(a_i\) 对 \(F(P_2,S_2)\) 的贡献,即 \(f_2(i)f_2(a_i)=s_is_{n-i+1}s_{a_i}s_{n-a_i+1}\)。

  • 再求 \(a_i\) 对 \(F(P_1,S_1)\) 的贡献:所有 \(i\in P_1,a_i\in S_1\) 的方案总数。注意此时每一个区间 \(P_1(S_1)\) 并不是只计算一次,还应考虑到其子区间 \(P_2(S_2)\) 的个数

    如法炮制,设贡献为 \(f_1(i)\times g_1(a_i)\),其中 \(f_1(i),g_1(a_i)\) 分别表示 \(i\in P_1,a_i\in S_1\) 的情况总数。梅开二度, 同理可得 \(f_1=g_1\)。根据其实际意义,枚举 \(P_1\) 左端点 \(l\ (l\leq i)\) 和右端点 \(r\ (i\leq r)\),再乘上其子区间个数,可得表达式:

    \[f_1(i)=\sum_{l=1}^i\sum_{r=i}^n\binom{r-l+2}{2}.
    \]

    注意此处 \(r-l+2\) 是因为区间 \(P_1\) 长度为 \(r-l+1\),而长度为 \(len\) 的区间共有 \(\binom{len+1}{2}\) 个子区间。将 \(\dfrac{1}{2}\) 提出,上式即:

    \[\frac{1}{2}\sum_{l=1}^i\sum_{r=i}^n(r-l+2)(r-l+1).
    \]

    拆开,可以得到:

    \[\frac{1}{2}\sum_{l=1}^i\sum_{r=i}^nr^2+l^2-2lr+3r-3l+2.
    \]

    别跟我说这你不会 \(\mathcal{O}(n)\) 预处理 \(\mathcal{O}(1)\) 求。 分别化简一下,实际上就是:

    \[\begin{aligned}2f_1(i)=&i(sq_n-sq_{i-1})+sq_i(n-i+1)-2s_i(s_n-s_{i-1})\\&+3i(s_n-s_{i-1})-3s_i(n-i+1)+2i(n-i+1)\end{aligned}.
    \]

    大功告成,这样 \(a_i\) 对 \(F(P_1,S_1)\) 的贡献即为 \(f_1(i)f_1(a_i)\)。


看似我们已经成功解决了这道题目,但实际上并没有。注意到题目并没有保证 \(a_i\) 互不相同。

假设如果有多个相等的数 \(a_{i_1}=a_{i_2}=\cdots=a_{i_c}\) 同时满足条件,那么不妨设只有最左边的数会对答案产生贡献。 但即便是这样,也不得不更新一下 \(f_1,f_2\) 的求法。

  • 实际上,只有对位置上的限制的总情况 \((i\in P_1(P_2))\) 需要重新计算,而对数值上的限制 \((a_i\in S_1(S_2))\) 并不需要,读者可自行思考。

根据上述假设,不难发现如果 \(a_i=a_j\ (i<j)\),那么 \(a_j\) 对所有左端点在 \(i\) 左边的 \(P_1(P_2)\) 都不会产生贡献。因此我们设 \(f_1'(pre,i)\) 表示 \(P_1\) 左端点在 \(pre\) 右侧的总情况数。有了求 \(f_1\) 的经验,不难写出 \(f_1'\) 的表达式:

\[f_1'(pre,i)=\sum_{l=pre+1}^i\sum_{r=i}^n\binom{r-l+2}{2}
\]

对比 \(f_1(i)\),可以发现 \(f_1'\) 相较于 \(f_1\) 只有左端点 \(l\) 的下界改变,即\(f_1(i)=f_1'(1,i)\)。类似的,不难得到其化简后的结果,方便 \(\mathcal{O}(1)\) 计算。请读者自行推导,此处不再赘述。

因此,\(a_i\) 对 \(F(P_1,S_1)\) 的贡献可以写为 \(f_1'(pre_i,i)\times f_1(a_i)\),其中 \(pre_i\) 为在 \(a_i\) 之前与 \(a_i\) 相等的最右边一个数的位置,若不存在则为 \(0\)。

同理,不难推出 \(f_2'(pre,i)\) 的表达式:因为 “嵌套的第一层左括号” 只能在 \(pre\) 右边,\(i\) 左边,因此可写出 \(f_2'(pre,i)=\sum_{j=pre+1}^ij\)。同样的,观察 \(f_2(i)\),可以发现 \(f_2'\) 相较于 \(f_2\) 只有左端点 \(l\) 的下界改变,即 \(f_2(i)=f_2'(1,i)\)。

综上,\(a_i\) 对答案的贡献可以写为 \(f_1'(pre_i,i)\times f_1(a_i)-f_2'(pre_i,i)\times f_2(a_i)\)。


结束了吗?还差一点。求出了 \(a_i\) 的总方案数,还需要求 \(P_1,P_2,S_1,S_2\) 的总方案数。由于 \(P_1,P_2\) 与 \(S_1,S_2\) 在定义上等价,因此可以单独算出 \(P_1,P_2\) 的总方案数 \(cnt\),再将其平方即可得到四个区间的总方案数。这也是为什么三个样例的分母都是平方数,给分数不约分的良心出题人点赞!

不妨枚举 \(P_1\) 的长度 \(len\),则 \(P_1\) 共有 \(n-len+1\) 种情况,此时其子区间 \(P_2\) 有 \(\binom{len+1}{2}\) 中情况。根据定义,不难发现 \(s_i\) 等价于 \(\binom{i+1}{2}\),因此有:

\[cnt=\sum_{i=1}^n(n-i+1)s_i.
\]

至此,本题被我们解决。


时间复杂度:预处理 \(\mathcal{O}(n)\),计算每个数的贡献 \(n\times\mathcal{O}(1)=\mathcal{O}(n)\),计算总情况数 \(\mathcal{O}(n)\)。

因此,总时空复杂度 \(\mathcal{O}(n)\)。


代码说明:

  • cals/calsq(l,r) 表示求 \(s(sq)\) 在 \([l,r]\) 上的和。
  • f1/f2(l,k) 表示求 \(f_1'(f_2')(l-1,k)\)。注意代码与实际定义的区别(代码中 \(pre_i\) 表示在 \(a_i\) 前与 \(a_i\) 相同的最右边的数的位置 \(+1\))
#include <bits/stdc++.h>
using namespace std; using ll = long long;
const int mod=1e9+7;
const ll iv2=mod+1>>1; ll ksm(ll a,ll b){
ll s=1,m=a;
while(b){
if(b&1)s=s*m%mod;
m=m*m%mod,b>>=1;
} return s;
} ll inv(ll x){return ksm(x,mod-2);} const int N=5e5+5;
ll n,a,ans,cnt,buc[N],s[N],sq[N];
ll cals(ll l,ll r){return (s[r]-s[l-1]+mod)%mod;}
ll calsq(ll l,ll r){return (sq[r]-sq[l-1]+mod)%mod;}
ll f1(ll l,ll k){
return ((calsq(l,k)*(n-k+1)+calsq(k,n)*(k-l+1)
-2*cals(l,k)*cals(k,n)%mod-3*cals(l,k)*(n-k+1)%mod
+3*cals(k,n)*(k-l+1)+2*(n-k+1)*(k-l+1))%mod+mod)*iv2%mod;
} ll f2(ll l,ll k){return cals(l,k)*s[n-k+1]%mod;} int main(){
cin>>n;
for(ll i=1;i<=n;i++)s[i]=(s[i-1]+i)%mod,sq[i]=(sq[i-1]+i*i)%mod;
for(ll i=1,pre;i<=n;i++){
scanf("%lld",&a),pre=buc[a]+1,buc[a]=i;
ans=(ans+f1(pre,i)*f1(1,a)-f2(pre,i)*f2(1,a)%mod+mod)%mod;
cnt=(cnt+(n-i+1)*s[i])%mod;
} cout<<ans*inv(cnt*cnt%mod)%mod<<endl;
return 0;
}

P7327 Dream and Discs的更多相关文章

  1. PK淘宝BUY+,京东推出AR购物应用JD Dream

        今年双十一淘宝推出了虚拟现实VR购物"BUY+",用户可以在虚拟环境中选购商品.那作为竞争对手的京东将使出什么绝招呢?在近日上海举办的谷歌开发者大会上得到了答案.会上京东推 ...

  2. [poj2411] Mondriaan's Dream (状压DP)

    状压DP Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One nigh ...

  3. Dream It Possible

    反复听着Dream It Possible,想起自己的华为岁月,百感交集!

  4. POJ 题目2411 Mondriaan's Dream(状压DP)

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 13519   Accepted: 787 ...

  5. 第一篇英文短文《It All Starts With A Dream》

    http://www.ximalaya.com/#/17209107/sound/6883165 Dreaming. Do you or don’t you? Do you dream about t ...

  6. POJ 2411 Mondriaan&#39;s Dream

    状压DP Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 9938 Accepted: 575 ...

  7. HDU 4686 Arc of Dream (矩阵快速幂)

    Arc of Dream Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  8. 状态压缩DP--Mondriaan's Dream

    题目网址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110044#problem/A Description Squares and ...

  9. POJ2411 Mondriaan's Dream

    Description Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, af ...

随机推荐

  1. Hadoop面试题(四)——YARN

    1.简述hadoop1与hadoop2 的架构异同 1)加入了yarn解决了资源调度的问题. 2)加入了对zookeeper的支持实现比较可靠的高可用. 2.为什么会产生 yarn,它解决了什么问题, ...

  2. 如果你还不知道Apache Zookeeper?你凭什么拿大厂Offer!!

    很多同学或多或少都用到了Zookeeper,并知道它能实现两个功能 配置中心,实现表分片规则的统一配置管理 注册中心,实现sharding-proxy节点的服务地址注册 那么Zookeeper到底是什 ...

  3. CentOS 文本编辑器

    目录 1.Nano 1.1.基础命令 1.2.快捷操作 1.3.配置文件 2.Vim 2.1.四大模式 2.2.基础命令 2.3.标准操作 2.4.高级操作 2.5.配置文件 Linux 终端的文本编 ...

  4. 类图示例-订单系统 / Class Diagram - Order System

    类图示例-订单系统 / Class Diagram - Order System 什么是类图? 类图通过显示它的类和它们之间的关系来概述系统.类图是静态的 - 它们显示交互的内容,但不显示交互时会发生 ...

  5. LeetCode:“剑指 Offer”

    LeetCode:"剑指 Offer" 刷题小菜鸡,花了几天时间做了一遍 LeetCode 上给出的 "剑指 Offer" 在此做一下记录 LeetCode主页 ...

  6. OO第三单元

    OO第三单元 JML语言理论基础,应用工具链 JML语言基础 JML简介 定义: JML 是一种形式化的. 面向 JAVA 的行为接口规格语言 作用: 开展规格化设计.这样交给代码实现人员的将不是可能 ...

  7. [调试笔记] 晚测5 T1 容易题

    众所周知,sbwzx在考试一结束就嚷嚷T1是个sb题.那他为什么调了2小时才调出来呢?快和小编一起看看吧. Sb题:指除了sbwzx别人都能做出来的题 1.CE:震惊!sbwzx竟然连map都不会用, ...

  8. 字符串与模式匹配算法(二):MP算法

    一.MP算法介绍 MP 算法(Morris-Pratt算法)是一种快速串匹配算法,它是詹姆斯·莫里斯(James Morris)和沃恩·普莱特(Vaughan Pratt)在1970年提出的一种快速匹 ...

  9. 树行DP小结

    顾名思义:就是在树上做的DP,依据DFS的性质,在访问过儿子之后返回后将儿子的状态传递给父亲... 先看例题: 此题用贪心也能过,不过正解是DP. 对于树上的DP我们可以直接考虑最优解下各点的状态来方 ...

  10. Android WebView 实现文件选择、拍照、录制视频、录音

    原文地址:Android WebView 实现文件选择.拍照.录制视频.录音 | Stars-One的杂货小窝 Android中的WebView如果不进行相应的设置,H5页面的上传按钮是无法触发And ...