题目传送门

题意简述:有 \(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. 【数据结构与算法Python版学习笔记】算法分析

    什么是算法分析 算法是问题解决的通用的分步的指令的聚合 算法分析主要就是从计算资源的消耗的角度来评判和比较算法. 计算资源指标 存储空间或内存 执行时间 影响算法运行时间的其他因素 分为最好.最差和平 ...

  2. Noip模拟61 2021.9.25

    T1 交通 考场上想了一个$NPC$.应该吧,是要求出图里面的所有可行的不重复欧拉路 无数种做法都无法解出,时间也都耗在这个上面的,于是就考的挺惨的 以后要是觉得当前思路不可做,就试着换一换思路,千万 ...

  3. Balance的数学思想构造辅助函数

    本类题的证明难点便在于如何构造出满足答案的辅助函数.通过下列类题便可以很好的理解. 题一 该类题可以理解为积分内部f(x)与xf(x)处于一种失衡状态,故我们需要使其平衡,否则直接构造出的函数无法满足 ...

  4. cf2A Winner(implementation)

    题意: N个回合. 每个回合:name score[名为name的这个人得了score分(可负可正)]. 问最后谁的累积分数是最高的.设为M.如果有好几个都得了M,找出这几个人中哪个最早回合累积分数超 ...

  5. 前端面试手写代码——JS数组去重

    目录 1 测试用例 2 JS 数组去重4大类型 2.1 元素比较型 2.1.1 双层 for 循环逐一比较(es5常用) 2.1.2 排序相邻比较 2.2 查找元素位置型 2.2.1 indexOf ...

  6. S 锁与 X 锁的爱恨情仇《死磕MySQL系列 四》

    系列文章 一.原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 二.一生挚友redo log.binlog<死磕MySQL系列 二> 三.MySQL强 ...

  7. 跬步千里 —— 阿里云Redis bitfield命令加速记

    link:https://developer.aliyun.com/article/757841 在一次阿里云客户问题解决中,通过给Redis添加bitfield_ro命令,解决了Redis官方bit ...

  8. Java Logback简易教程

    本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可. 一.前言 本文以一个简单的项目为例,一步步展示logback的同步和异步配置方法,并且配置的日志要求满足阿里巴巴Java开发手册- ...

  9. jenkins持续集成Allure生成报表+邮件推送

    本次基于<jenkins 生成HTML报表,邮件推送>的基础上将生成HTML报表修改为Allure生成报表,可以参考官方文档:https://docs.qameta.io/allure/# ...

  10. 设计模式--策略模式Strategy

    策略模式 算法经常需要被改变==使用S 节省资源(很多if else if-.不会被执行,却会被装载到代码段) 动机 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到 ...