题目传送门

题意简述:有 \(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. Hive架构及搭建方式

    目录 前言 hive的基础知识 基本架构 metastore 内嵌服务和数据库 内嵌服务 服务和数据库单独部署 hcatalog 客户端 客户端的本地模式 beeline beeline的自动模式 j ...

  2. 【UE4】GAMES101 图形学作业5:光线与物体相交(球、三角面)

    总览 在这部分的课程中,我们将专注于使用光线追踪来渲染图像.在光线追踪中最重要的操作之一就是找到光线与物体的交点.一旦找到光线与物体的交点,就可以执行着色并返回像素颜色. 在这次作业中,我们要实现两个 ...

  3. 【UE4 设计模式】工厂方法模式 Factory Method Pattern 及自定义创建资源

    概述 描述 又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式,或者多态工厂(Polymorphic Factory)模式 工厂父类负责定义创建产品对象的公共接口,而工厂子类 ...

  4. Java正则中"\\\\"表示普通反斜杠

    Java中"\"用于转义字符,"\\"表示普通无转义功能的反斜杠. 如果将字符串当做正则表达式来解析,那么"\\"也有了特殊意义,它与其后的 ...

  5. Java多线程中的死锁

    Java多线程中的死锁 死锁产生的原因 线程死锁是指由两个以上的线程互相持有对方所需要的资源,导致线程处于等待状态,无法往前执行. 当线程进入对象的synchronized代码块时,便占有了资源,直到 ...

  6. spring session实现session统一管理(jdbc实现)

    最近在看一些关于spring session 的知识,特做一个笔记记录一下. 在项目中经常会遇到这么一种情况,同一个web项目有时需要部署多份,然后使用nginx实现负载均衡,那么遇到的问题就是,部署 ...

  7. FastAPI 学习之路(三十四)数据库多表操作

    之前我们分享的是基于单个的数据库表的操作,我们在设计数据库的时候也设计了跨表,我们可以看下数据库的设计. class User(Base): __tablename__ = "users&q ...

  8. 企业级BI为什么这么难做?

    本人长期在银行内从事数据线相关工作,亲眼目睹过多个企业级BI(非部门级BI)产品从上线试用.全行推广.然后衰败没落,再替换到下一个BI产品重复此过程.企业内没有任何一个BI产品即能长期运行,又能赢得非 ...

  9. gitbook热更新时报错operation not permitted

    在使用gitbook写东西的时候,当文档内容有更新的时候,会自动更新内容到页面上,方便预览.但是,存在一个bug,就是会神奇的崩溃掉,出现如下的错误提示: Restart after change i ...

  10. robot_framewok自动化测试--(9)连接并操作 MySql 数据库

    连接并操作 MySql 数据库 1.mysql数据库 1.1安装mysql数据库 请参考我的另一篇文章:MYSQL5.7下载安装图文教程 1.2.准备测试数据 请参考我的另一篇文章:Mysql基础教程 ...