繁凡出品的全新系列:解题报告系列 —— 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 111 为基准。


这样大家在学习算法的时候就可以执行这样的流程:

阅读我的【学习笔记】 / 【算法全家桶】学习算法 ⇒\Rightarrow⇒ 阅读我的相应算法的【解题报告】获得高质量题单 ⇒\Rightarrow⇒ 根据我的一句话题解的提示尝试自己解决问题 ⇒\Rightarrow⇒ 点开我的详细题解链接学习巩固(好耶)
%

题单链接:【解题报告】快速沃尔什变换FWT(ICPC / CCPC / NOIP / NOI / CF / AT / NC / P / BZOJ)超高质量题解 !!!

F、(2018 ACM - ICPC shenyang I)Distance Between Sweethearts(数学期望 + 乘法原理 + FWT)

Link

http://acm.hdu.edu.cn/showproblem.php?pid=6456

Problem

太长不看

给定6个不超过 2000 的整数: UIboy,UAboy,UGboyUI_{boy}, UA_{boy}, UG_{boy}UIboy​,UAboy​,UGboy​ 和 UIgirl,UAgirl,UGgirlUI_{girl}, UA_{girl}, UG_{girl}UIgirl​,UAgirl​,UGgirl​

定义 Igirl,Agirl,GgirlI_{girl}, A_{girl}, G_{girl}Igirl​,Agirl​,Ggirl​ 和 Iboy,Aboy,GboyI_{boy}, A_{boy}, G_{boy}Iboy​,Aboy​,Gboy​。

给出了以下公式来测量我的爱人和我的心之间的距离:

distance(boy,girl)=max⁡{∣Iboy−Igirl∣,∣Aboy−Agirl∣,∣Gboy−Ggirl∣}⊕Iboy⊕Aboy⊕Gboy⊕Igirl⊕Agirl⊕Ggirldistance(boy, girl) = \max\{|I_{boy} - I_{girl}|, |A_{boy} - A_{girl}|, |G_{boy} - G_{girl}|\} \oplus I_{boy} \oplus A_{boy} \oplus G_{boy} \oplus I_{girl} \oplus A_{girl} \oplus G_{girl}distance(boy,girl)=max{∣Iboy​−Igirl​∣,∣Aboy​−Agirl​∣,∣Gboy​−Ggirl​∣}⊕Iboy​⊕Aboy​⊕Gboy​⊕Igirl​⊕Agirl​⊕Ggirl​

其中maxSmax{S}maxS、∣x∣|x|∣x∣ 和 ⊕⊕⊕ 分别对应S的最大值、x的绝对值和位异或运算符。

它们满足以下限制条件:

0≤Igirl≤UIgirl,0≤Agirl≤UAgirl,0≤Ggirl≤UGgirl0 \le I_{girl} \le UI_{girl}, 0 \le A_{girl} \le UA_{girl}, 0 \le G_{girl} \le UG_{girl}0≤Igirl​≤UIgirl​,0≤Agirl​≤UAgirl​,0≤Ggirl​≤UGgirl​

0≤Iboy≤UIboy,0≤Aboy≤UAboy,0≤Gboy≤UGboy0 \le I_{boy} \le UI_{boy}, 0 \le A_{boy} \le UA_{boy}, 0 \le G_{boy} \le UG_{boy}0≤Iboy​≤UIboy​,0≤Aboy​≤UAboy​,0≤Gboy​≤UGboy​

它们的任意值在其限制条件下都可以是具有相同概率的整数。

现在我需要你的帮助来计算我们这对依然热恋的情侣的心之间距离的期望。

请你输出 (1+UIboy)(1+UAboy)(1+UGboy)(1+UIgirl)(1+UAgirl)(1+UGgirl)(1 + UI_{boy}) (1 + UA_{boy}) (1 + UG_{boy}) (1 + UI_{girl}) (1 + UA_{girl}) (1 + UG_{girl})(1+UIboy​)(1+UAboy​)(1+UGboy​)(1+UIgirl​)(1+UAgirl​)(1+UGgirl​) 与距离的期望的乘积(保证答案一定是一个整数)。

保证答案在 264−12^{64} - 1264−1 以内。

Sample Input

3
3 1 2 4 3 3
1 2 1 2 1 3
3 2 5 4 3 5

Sample Output

Case #1: 3880
Case #2: 369
Case #3: 24728

Hint

一句话题解: 求期望不止用公式这一种求法,还有求平均值法。仔细读题发现答案是距离的期望乘上一坨东西,而那一坨东西就是总方案数,也就是我们只需要求 ∑distance×方案数\sum distance\times \text{方案数}∑distance×方案数 即可。所以就转换为了一个计数问题。而这道题距离的公式中全是 ⊕\oplus⊕ ,这提示着我们向着FWT 的套路走,思考一下题目中的 maxmaxmax 到底代表着什么,尝试分析题意将distance的公式做FWT的经典变换是解题的关键。

Solution

啊我讲的太清楚了,这道题我已经懂的透透的了

确实是好题,而且不算太难,读清题意之后挺板子的 hhh

但是能不能别搞这么长的题!!!


题目要求的是期望,但是没有给权重,所以不能用期望公式 E(X)=∑pi×xiE(X)=\sum p_i\times x_iE(X)=∑pi​×xi​ 来算,因为题目中说了每个任意值在限制条件下都是具有相同概率的整数,所以实际上这道题就是求平均值。

也就是例如:设随机变量 XXX 表示掷一个骰子的点数,显然期望为 E(X)=1+2+3+4+5+66=3.5E(X)=\cfrac{1+2+3+4+5+6}{6}=3.5E(X)=61+2+3+4+5+6​=3.5

期望的性质:E(aX+bY)=a×E(X)+b×E(Y)E(aX+bY)=a\times E(X)+b\times E(Y)E(aX+bY)=a×E(X)+b×E(Y)


我们知道距离的期望 ans=∑(distance×方案数)总方案数ans= \frac{\sum (distance \times\text{方案数})}{总方案数}ans=总方案数∑(distance×方案数)​

而总方案数等于 (1+UIboy)(1+UAboy)(1+UGboy)(1+UIgirl)(1+UAgirl)(1+UGgirl)(1 + UI_{boy}) (1 + UA_{boy}) (1 + UG_{boy}) (1 + UI_{girl}) (1 + UA_{girl}) (1 + UG_{girl})(1+UIboy​)(1+UAboy​)(1+UGboy​)(1+UIgirl​)(1+UAgirl​)(1+UGgirl​) ,因为每个数 III 的范围都是 0∼U0\sim U0∼U。

题目要求的是 (1+UIboy)(1+UAboy)(1+UGboy)(1+UIgirl)(1+UAgirl)(1+UGgirl)(1 + UI_{boy}) (1 + UA_{boy}) (1 + UG_{boy}) (1 + UI_{girl}) (1 + UA_{girl}) (1 + UG_{girl})(1+UIboy​)(1+UAboy​)(1+UGboy​)(1+UIgirl​)(1+UAgirl​)(1+UGgirl​) 与距离的期望的乘积,也就是答案 ans=∑(distance×方案数)ans=\sum (distance \times\text{方案数})ans=∑(distance×方案数)。

所以这是一个计数问题!实际上这道题就是让你求所有能组成的 distance 以及组成这个distance 的方案数!这不就跟上一题一样吗!

考虑 FWT。

所以我们尽量将找一个数组,使得公式中想要进行异或卷积的那些数是这个数组的下标!

所以我们来一步一步分析题目。先来分析一下 Max\text{Max}Max ,若三个绝对值分别为 (x,y,z)(x,y,z)(x,y,z),则 Max=max⁡{x,y,z}\text{Max} = \max\{x,y,z\}Max=max{x,y,z}

我们知道这三个绝对值的实际意义就是 boyboyboy 与 girlgirlgirl 之间的差值。假设男生属性值都低于女生(对输入的数据交换一下就行了),则可得到:

distance=max⁡{x,y,z}⊗Iboy⊗(Iboy+x)⊗Aboy⊗(Aboy+y)⊗Gboy⊗(Gboy+z)distance = \max\{x,y,z\} \otimes I_{boy} \otimes (I_{boy}+x) \otimes A_{boy} \otimes (A_{boy} + y) \otimes G_{boy} \otimes (G_{boy} + z)distance=max{x,y,z}⊗Iboy​⊗(Iboy​+x)⊗Aboy​⊗(Aboy​+y)⊗Gboy​⊗(Gboy​+z)

注意输入的六个整数 UIboy,UAboy,UGboyUI_{boy}, UA_{boy}, UG_{boy}UIboy​,UAboy​,UGboy​ 和 UIgirl,UAgirl,UGgirlUI_{girl}, UA_{girl}, UG_{girl}UIgirl​,UAgirl​,UGgirl​ 均为 Igirl,Agirl,GgirlI_{girl}, A_{girl}, G_{girl}Igirl​,Agirl​,Ggirl​ 和 Iboy,Aboy,GboyI_{boy}, A_{boy}, G_{boy}Iboy​,Aboy​,Gboy​ 的范围,也就是关键在于
0≤Igirl≤UIgirl,0≤Agirl≤UAgirl,0≤Ggirl≤UGgirl0 \le I_{girl} \le UI_{girl}, 0 \le A_{girl} \le UA_{girl}, 0 \le G_{girl} \le UG_{girl}0≤Igirl​≤UIgirl​,0≤Agirl​≤UAgirl​,0≤Ggirl​≤UGgirl​

0≤Iboy≤UIboy,0≤Aboy≤UAboy,0≤Gboy≤UGboy0 \le I_{boy} \le UI_{boy}, 0 \le A_{boy} \le UA_{boy}, 0 \le G_{boy} \le UG_{boy}0≤Iboy​≤UIboy​,0≤Aboy​≤UAboy​,0≤Gboy​≤UGboy​

而 UUU 小于 200020002000,所以我们就可以枚举。

我们统计出每种 Iboy⊗IgirlI_{boy} \otimes I_{girl}Iboy​⊗Igirl​ ( ∣Iboy−Igirl∣≤x|I_{boy} - I_{girl}| ≤ x∣Iboy​−Igirl​∣≤x ) ,也就是枚举差值 x,y,zx,y,zx,y,z 的最大值 Max\text{Max}Max ,三个差值最大值为 Max\text{Max}Max,也就意味着 boyboyboy 与 girlgirlgirl 之间的最大差值也不会超过 Max\text{Max}Max 。所以我们在枚举到某个 Max\text{Max}Max 值时预处理出所有差值为 Max\text{Max}Max 且异或值为 ttt 的数对有多少个存到数组中,这样我们计算到 Max\text{Max}Max 时就说明把 1∼Max1\sim \text{Max}1∼Max 的所有差值都加在了这个数组中,也就是所有情况都有了。至此,我们知道了每个属性差值最大为 Max\text{Max}Max 时每个异或值有多少种可能,总共产生三个 cnt 数组 cntI,cntA,cntGcnt_I,cnt_A,cnt_GcntI​,cntA​,cntG​。

显然根据乘法原理,我们可以求出 tmp=Iboy⊗(Iboy+x)⊗Aboy⊗(Aboy+y)⊗Gboy⊗(Gboy+z)\text{tmp} = I_{boy} \otimes (I_{boy}+x) \otimes A_{boy} \otimes (A_{boy} + y) \otimes G_{boy} \otimes (G_{boy} + z)tmp=Iboy​⊗(Iboy​+x)⊗Aboy​⊗(Aboy​+y)⊗Gboy​⊗(Gboy​+z) 的方案数 KKK 为:

∑(cntI[Iboy⊗(Iboy+x)]×cntA[Aboy⊗(Aboy+y)]×cntG[Gboy⊗(Gboy+z)])∑ (cnt_I[ I_{boy} \otimes (I_{boy}+x) ] \times cnt_A[A_{boy} \otimes (A_{boy} + y)] \times cnt_G[G_{boy} \otimes (G_{boy} + z)])∑(cntI​[Iboy​⊗(Iboy​+x)]×cntA​[Aboy​⊗(Aboy​+y)]×cntG​[Gboy​⊗(Gboy​+z)])

这样我们就将数值的异或操作 Iboy⊗(Iboy+x)I_{boy} \otimes (I_{boy}+x)Iboy​⊗(Iboy​+x) 转换为了数组的下标,这样我们就可以使用 FWT 加速异或卷积了。

即:

∑tmp=Iboy⊗(Iboy+x)⊗Aboy⊗(Aboy+y)⊗Gboy⊗(Gboy+z)cntI[Iboy⊗(Iboy+x)]×cntA[Aboy⊗(Aboy+y)]×cntG[Gboy⊗(Gboy+z)])\sum_{\text{tmp} = I_{boy} \otimes (I_{boy}+x) \otimes A_{boy} \otimes (A_{boy} + y) \otimes G_{boy} \otimes (G_{boy} + z)}cnt_I[ I_{boy} \otimes (I_{boy}+x) ] \times cnt_A[A_{boy} \otimes (A_{boy} + y)] \times cnt_G[G_{boy} \otimes (G_{boy} + z)]) tmp=Iboy​⊗(Iboy​+x)⊗Aboy​⊗(Aboy​+y)⊗Gboy​⊗(Gboy​+z)∑​cntI​[Iboy​⊗(Iboy​+x)]×cntA​[Aboy​⊗(Aboy​+y)]×cntG​[Gboy​⊗(Gboy​+z)])

而我们要求的 distance :

distance=Max⊕tmp\text{distance} = \text{Max}\oplus tmpdistance=Max⊕tmp

最终的答案既是
∑distance=Max⊕tmp×K\sum distance= \text{Max}\oplus tmp\times K∑distance=Max⊕tmp×K

也就是说我们最后还要来计算 Max\text{Max}Max,那么在 Max\text{Max}Max 值固定的情况下,也就是 x,y,zx,y,zx,y,z 至少有一个等于定值 Max\text{Max}Max,因为 Max=max⁡{x,y,z}\text{Max}=\max\{x,y,z\}Max=max{x,y,z} 嘛。

考虑容斥,令一种方案为 Iboy,Igirl=(Iboy+x),Aboy,Agirl=(Aboy+y),Gboy,Ggirl=(Gboy+z)I_{boy} ,I_{girl} = (I_{boy}+x), A_{boy} , A_{girl} =(A_{boy} + y) , G_{boy} ,G_{girl} = (G_{boy} + z)Iboy​,Igirl​=(Iboy​+x),Aboy​,Agirl​=(Aboy​+y),Gboy​,Ggirl​=(Gboy​+z) ,记作 (x,y,z)(x,y,z)(x,y,z)

因为我们的条件是至少有一个数等于 Max\text{Max}Max,如果我们计算出来了 x≤Max &&y≤Max &&z≤Maxx\le \text{Max}\ \&\&\ y\le\text{Max}\ \&\&\ z\le \text{Max}x≤Max && y≤Max && z≤Max 的方案数 AAA(满足条件上界),又计算出了 x<Max &&y<Max &&z<Maxx<\text{Max}\ \&\&\ y<\text{Max}\ \&\&\ z <\text{Max}x<Max && y<Max && z<Max 的方案数 BBB (不满足条件的下界), 上述的方案数就等于 A−BA - BA−B。我们怎么计算这个差值呢?很明显因为我们是枚举 Max\text{Max}Max 计算的,所以我们用前缀和维护,pre[i]pre[i]pre[i] 表示三个数都大于等于 Max=i\text{Max}=iMax=i,pre[i−1]pre[i - 1]pre[i−1] 就表示三个数都大于等于 i−1i-1i−1,即三个数都小于 Max\text{Max}Max。 我们将二者相减即为答案 A−BA-BA−B。


总结一下思路:

枚举 Max\text{Max}Max, 把每个绝对值展开,用 cntcntcnt 数组记录个数。后面的异或看作 FWT 下标,FWT 之后,即可求出 Max\text{Max}Max 里面三个绝对值恰好都小于等于 Max\text{Max}Max 的方案数。由于题目中要求的是至少一个绝对值小于等于 Max\text{Max}Max。所以用前缀和, preprepre 数组记录之前 FWT 的结果,每次 FWT 后,减掉 preprepre ,就是至少一个小于等于 Max\text{Max}Max 的方案数。distance = Max ^ i,其中 distance 就是题目公式中的 distance,Max 是枚举到的 Max\text{Max}Max,iii 是枚举到的异或值(异或值转成下标了)

顺带一提,保证答案在 264−12^{64} - 1264−1 以内,所以我们最后的答案 ans 要用 unsigned long long 存,用 cout 输出。

Code

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>using namespace std;
typedef long long ll;
typedef int itn;
typedef unsigned long long ull;
const int N = 2048 + 7, mod = 1e9 + 7;
const ll INF = 4e18;
itn dcnt;
#define de(x) cout << x << " x" << endl
#define de1() cout << ++ dcnt << "ok" << endl
itn t;
ll a[5][N], cnt[5][N];
ll pre[N];void XOR(ll *f, int n, int x = 1)
{for(int o = 2; o <= n; o <<= 1) {for(int i = 0, k = o >> 1; i < n; i += o) {for(int j = 0; j < k; ++ j) {ll X = f[i + j];ll Y = f[i + j + k];f[i + j] = X + Y;f[i + j + k] = X - Y;if(x == -1) {f[i + j] = (X + Y) / 2;f[i + j + k] = (X - Y) / 2;}}}}
}void update(int n, int m, int d, int id)
{for(int i = 0; i <= n && i + d <= m; ++ i) {cnt[id][i ^ (i + d)] ++ ;//boy ^ girl}if(d) {//不等于0说明有两个,一个 boy 一个 girlfor(int i = 0; i <= m && i + d <= n; ++ i) {cnt[id][i ^ (i + d)] ++ ;}}
}ll uib, uab, ugb, uig, uag, ugg;
int kcase;int main()
{scanf("%d", &t);while(t -- ) {memset(pre, 0, sizeof pre);memset(a, 0, sizeof a);memset(cnt, 0, sizeof cnt);scanf("%lld%lld%lld%lld%lld%lld", &uib, &uab, &ugb, &uig, &uag, &ugg);if(uib > uig) swap(uib, uig);if(uab > uag) swap(uab, uag);if(ugb > ugg) swap(ugb, ugg);int maxx = max({uig, uag, ugg});int tmp = maxx;itn n = 1;ull ans = 0;while(tmp) {tmp >>= 1;// 2的整数幂n <<= 1;}for(int Max = 0; Max <= maxx; ++ Max) { //枚举距离dupdate(uib, uig, Max, 0);update(uab, uag, Max, 1);update(ugb, ugg, Max, 2);for(int i = 0; i < n; ++ i) {//赋值,准备卷a[0][i] = cnt[0][i];a[1][i] = cnt[1][i];a[2][i] = cnt[2][i];}XOR(a[0], n);XOR(a[1], n);XOR(a[2], n);for(int i = 0; i < n; ++ i)a[0][i] = a[0][i] * a[1][i] * a[2][i];XOR(a[0], n, -1);for(int i = 0; i < n; ++ i) {ll distance = 1ll * (Max ^ i);ans += 1ull * (a[0][i] - pre[i]) * distance;//根据容斥,减掉前面的贡献pre[i] = a[0][i];}}cout << "Case #" <<  ++ kcase<< ": " << ans << endl;}return 0;
}

解题报告(一)F、(2018 ACM - ICPC shenyang I)Distance Between Sweethearts(数学期望 + 乘法原理 + FWT)(4.5)相关推荐

  1. 2018 ACM/ICPC 沈阳站 J How Much Memory Your Code Is Using?

    题目描述 In the C++ language, the values of variables are stored somewhere in the computer memory as zer ...

  2. 2018 ACM ICPC Asia Regional - Seoul B.Cosmetic Survey

    参考大佬代码 题目大意 nnn个顾客,mmm种画妆品,每一个顾客会给mmm种化妆品一个值,这个值代表这个化妆品在他心中的排名,排名越小越喜欢,如果这个值为0说明最不喜欢这一种化妆品(值为0理解为无穷大 ...

  3. 2018 ACM/ICPC 沈阳站小结

    第二次现场赛,能拿金已经很开心了 热身赛 开幕式后的热身赛都是训练过的三个题,40min基本就解决了,剩下的时间就是在调试机器什么的 现场赛 上来队友先过了J的模拟,我看了看G题,发现可做就直接上了, ...

  4. 2018 ACM/ICPC 南京站小结

    第一次打现场赛,又是在半主场,其实挺激动的,但是结果不尽人意 热身赛 开幕式后的热身赛就打得有些问题,四个题都不难,我们都想到了做法,但因为机时不够+细节问题导致前两个小时一直没有过题,然后AC的三道 ...

  5. 2018 ACM ICPC Arabella Collegiate Programming Contest A

    Multiplication operation is not always easy! For example, it is hard to calculate 27 × 20 using your ...

  6. A - Multiplication Dilemma (思维)( 2018 ACM ICPC Arabella Collegiate Programming Contest)

    滴答滴答---题目链接 Multiplication operation is not always easy! For example, it is hard to calculate 27 × 2 ...

  7. 2018 ACM/ICPC 北京赛区网络赛 D 80 Days 线段树

    http://hihocoder.com/problemset/problem/1831?sid=1390457 描述 80 Days is an interesting game based on ...

  8. 解题报告(一)快速沃尔什变换FWT(ACM / OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  9. 2018 ACM-ICPC Asia Shenyang Regional Contest 题解(9 / 13)【每日亿题2021/2/24】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A.(2018 ACM-ICPC Shenyang J)How Much Memory Your ...

最新文章

  1. AI之父图灵登上50英镑钞票,荣耀比肩牛顿达尔文;吴恩达:将激励更多人
  2. linux进程端口防火墙
  3. 程序员面试题精选100题(49)-复杂链表的复制[算法]
  4. linux系统查看性能,linux查看操作系统(linux查看性能)
  5. 2015年第六届蓝桥杯 - 省赛 - C/C++大学C组 - B. 立方尾不变
  6. 被迫学计算机,电脑强迫人学习
  7. 我眼中的 NCC,WTM 寻亲之旅
  8. 一个项目的整个测试流程
  9. 在图像中截取小图并保存
  10. linux虚拟光驱挂载方法,Linux操作系统下虚拟光驱(iso)的挂载
  11. Git——单人操作及多人协同操作
  12. linux如何运行python_[TimLinux] Python如何运行程序
  13. MySQL命令行格式化输出
  14. JSP教程第4讲笔记
  15. 芭蕉树上第十五根芭蕉-- qt帮助文档使用
  16. flex横向纵向间距,自适应排列
  17. 中国饲料矿物质添加剂市场趋势报告、技术动态创新及市场预测
  18. 插值算法(一):各种插值方…
  19. 《代码整洁之道》简单总结
  20. 基于android的防抖音直播,uniapp 仿火山 / 抖音短视频|uni-App+vue 直播实例

热门文章

  1. 每日一题(合并表格)
  2. 链表问题5——反转部分单向链表
  3. 深入剖析Kubernetes k8s
  4. Date, TimeZone, MongoDB, java中date的时区问题
  5. [译] 解密 Uber 如何使用RNN预测极端事件
  6. dependent-name ‘xxx::yyy’ is parsed as a non-type, but instantiation yields a type
  7. Generic Data Access Layer泛型的数据访问层
  8. [置顶]使用 maven 插件 maven-shade-plugin 对可执行 java 工程及其全部依赖 jar 进行打包...
  9. 在Sun Enterprise Server上配置SCSI磁带机
  10. [转]解读手机专业术语