题目传送门

题意简述:有 \(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. 初始HTML04

    HTML 列表标签 无序列表 默认用实心圆点标识列表项 1 <ul> 2 <li>list item 列表项</li> 3 <li>list item ...

  2. relativeLayout相对布局的嵌套在py中的引用

    from kivy.app import App from kivy.uix.button import Button from kivy.uix.relativelayout import Rela ...

  3. the Agiles Scrum Meeting 11

    会议时间:2020.4.20 20:00 1.每个人的工作 在这次例会上,我们对上周完成的工作进行了总结. 本周已完成的工作 个人结对项目增量开发组 tq: 创建广播功能 修复纯英文数字可能溢出bug ...

  4. 2020BUAA软工个人博客作业

    2020BUAA软工个人博客作业 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标是 学 ...

  5. Noip模拟77 2021.10.15

    T1 最大或 $T1$因为没有开$1ll$右移给炸掉了,调了一年不知道为啥,最后实在不懂了 换成$pow$就过掉了,但是考场上这题耽误了太多时间,后面的题也就没办法好好打了.... 以后一定要注意右移 ...

  6. 零基础小白要如何跟好的学习嵌入式Linux(转)

    作为一个新人,怎样学习嵌入式Linux?被问过太多次,特写这篇文章来回答一下. 在学习嵌入式Linux之前,肯定要有C语言基础.汇编基础有没有无所谓(就那么几条汇编指令,用到了一看就会). C语言要学 ...

  7. 攻防世界 杂项 12.Training-Stegano-1

    题目描述: 这是我能想到的最基础的图片隐写术.啊这 题目分析: 最初还以为直接右击属性查看呢 然后用notepad++看看,一团乱码,结果在最后发现了passwd, 然后这就是flag:stegano ...

  8. 使用 ASP.NET Core 3.1 的微服务开发指南

    使用 ASP.NET Core 3.1 的微服务 – 终极详细指南 https://procodeguide.com/programming/microservices-asp-net-core/ A ...

  9. PHP笔记4__函数/全局、静态变量/函数参数/加载函数库/,,

    <?php header("Content-type: text/html; charset=utf-8"); echo table(5,5); function table ...

  10. Docker 18.03 Centos7.6 安装 内网

    首先访问https://download.docker.com/linux/centos/7/x86_64/stable/Packages/获取对应版本的rpm包docker包docker-ce-18 ...