ABC392题解

Atcoder Beginner Contest 392

D - Doubles

题目大意

给定 \(N\) 个骰子,每个骰子有不同数量的面,每个面上写着一个数字。选择两个骰子,同时掷出,计算两个骰子出现相同数字的概率。目标是找到选择哪两个骰子能使这个概率最大,并输出这个最大的概率。

解题思路

注意到数据范围中有一条 \(K_1 + K_2 + \dots + K_N \leq 10^5\)

考虑使用 unordered_map 统计每个骰子各数字出现的频率,遍历每个骰子对,计算相同数字出现的概率之和,取最大值就是答案。

核心代码

vector<unordered_map<int,int>> freq(n+1);
for(int i=1;i<=n;i++){for(int j=1;j<=k[i];j++){freq[i][a[i][j]]++;}
}double ans=0.0;
for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){double prob = 0.0;for(auto &p:freq[i]){int num=p.first;int cnt_i=p.second;if(freq[j].count(num)){int cnt_j=freq[j][num];prob+=((double)cnt_i/k[i])*((double)cnt_j/k[j]);}}ans=max(ans,prob);}
}

F - Insert

题目大意

给定一个空数组 \(A\),依次进行 \(N\) 次插入操作。第 \(i\) 次操作将数字 \(i\) 插入到数组 \(A\) 的第 \(P_i\) 个位置(从 \(1\) 开始计数)。输出最终的数组 \(A\)

解题思路

使用树状数组维护数组 \(A\) 的空位信息,快速找到插入位置。

对于插入操作: 每个 \(i\)\(N\)\(1\),使用树状数组 findKth 操作,找到第 \(P_i\) 个空位在数组 \(A\) 中的位置 \(pos\),将数字 \(i\) 插入到数组 \(A\) 的位置 \(pos\),在树状数组中,将位置 \(pos\) 的值更新为 \(0\),表示该位置已被占用。

时间复杂度为 \(O(N \times \log N)\),空间复杂度为 \(O(N)\)

核心代码

struct Fenwick{int n;vector<int> c;Fenwick(int n):n(n),c(n+1,0){}...int findKth(int k){ //查找第 k 个空位操作int pos=0,bit=1<<20;for(;bit;bit>>=1){int nxt=pos+bit;if(nxt<=n&&c[nxt]<k){k-=c[nxt];pos=nxt;}}return pos+1;}
};int main(){...vector<int> ans(n+1,0);Fenwick t(n);for(int i=1;i<=n;i++)t.update(i,1);for(int i=n;i>=1;i--){int pos=t.findKth(P[i]);ans[pos]=i;t.update(pos,-1);}for(int i=1;i<=n;i++)cout<<ans[i]<<" ";cout<<"\n";return 0;
}

G - Fine Triplets

题目大意

给定一个包含 \(N\) 个不同正整数的集合 \(S\)

如果三个整数 \(A, B, C (A < B < C)\) 满足 \(B - A = C - B\),则称 \((A, B, C)\) 为一个“好三元组”。

求集合 \(S\) 中有多少个好三元组。

解题思路

利用 FFT 加速卷积运算,快速统计。

使用 FFT 计算数组 \(f\) 与自身的卷积,得到数组 \(conv\)。数组 \(conv\) 的第 \(i\) 个元素表示集合 \(S\) 中有多少对数字 \((x, y)\) 满足 \(x + y = i\)

遍历集合 \(S\) 中的每个元素 \(b\)

对于每个元素 \(b\),计算 \(2 \times b\) 的值。

如果 \(2\times b\) 小于数组 \(conv\) 的大小,则 \(conv_{2\times b}\) 表示集合 \(S\) 中有多少对数字 \((x, y)\) 满足 \(x + y = 2\times b\)

由于 \(x\)\(y\) 可以相同,因此需要减去 \(1\)(即 \(x = y = b\) 的情况)。

由于 \((x, y)\)\((y, x)\) 算作同一种情况,因此需要除以 \(2\)

每次计算完之后将结果累加到 ans 中。

时间复杂度 \(O(m \times \log m)\)

核心代码(已包含在你的代码中)

void FFT(vector<db>&a,bool invert){int n=a.size();for(int i=1,j=0;i<n;i++){int bit=n>>1;for(;j&bit;bit>>=1)j-=bit;j+=bit;if(i<j)swap(a[i],a[j]);}for(int len=2;len<=n;len<<=1){double ang=2*PI/len*(invert?-1:1);db wlen(cos(ang),sin(ang));for(int i=0;i<n;i+=len){db w=1;for(int j=0;j<len/2;j++){db u=a[i+j],v=a[i+j+len/2]*w;a[i+j]=u+v;a[i+j+len/2]=u-v;w*=wlen;}}}if(invert)for(db&x:a)x/=n;
}vector<ll> calc(vector<int>&a,vector<int>&b){vector<db> fa(a.begin(),a.end()),fb(b.begin(),b.end());int n=1;while(n<(int)(a.size()+b.size()-1))n<<=1;fa.resize(n);fb.resize(n);FFT(fa,0);FFT(fb,0);for(int i=0;i<n;i++)fa[i]*=fb[i];FFT(fa,1);vector<ll> res(n);for(int i=0;i<n;i++)res[i]=(ll)round(fa[i].real());return res;
}int main(){...int m=*max_element(s.begin(),s.end());vector<int>f(m+1,0);for(int x:s)f[x]=1;vector<ll>conv=calc(f,f);ll ans=0;for(int b:s){int idx=2*b;if(idx<conv.size())ans+=(conv[idx]-1)/2;}...
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/881123.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MathType 7.4下载与安装

《数学公式编辑器(MathType)》 [1]是一款专业的数学公式编辑工具,理科生专用的工具。mathtype公式编辑器能够帮助用户在各种文档中插入复杂的数学公式和符号。 数学公式编辑器工具可以轻松输入各种复杂的公式和符号,与Office文档完美结合,显示效果超好,比Office自带的公式编…

支付流程设计常见问题及最佳实践

在实际操作中,支付流程常常面临诸多问题。本文将深入探讨支付流程设计中的常见问题及其最佳实践,供大家参考。今天聊一下支付流程设计的一些常见总是及最佳实践,包括: 组合支付要不要拆支付流水,前端轮询查哪个域,查询要不要穿透到外部渠道,为什么要做同步受理异步处理,…

原 侧边栏公告

<!-- 配置项详情见 https://bndong.github.io/Cnblogs-Theme-SimpleMemory/v2/#/Docs/Customization/config --><script type="text/javascript"> window.cnblogsConfig = {info: {name: , //「待填内容」 用户名startDate: , //「待填内容」 入园时间,…

读算法简史:从美索不达米亚到人工智能时代11搜索网络

20世纪70年代小型计算机普及,苹果推出Apple和Macintosh;蒂姆伯纳斯-李提出万维网,改变了网络访问方式;亚马逊采用个性化推荐算法;谷歌开发PageRank算法,引领网络搜索和关键字广告。1. 小型计算机 1.1. 到了20世纪70年代,小型计算机已在科研院所、大学和大公司中广泛应用…

Roslyn 源代码生成器 SourceGenerator 获取代码文件的本地绝对路径

本文告诉大家如何在源代码生成器 SourceGenerator 里面获取代码文件的本地文件的绝对路径从 compilation 的 Options 拿到 SourceReferenceResolver 对象,调用其 NormalizePath 方法,传入 SyntaxTree 的 FilePath 参数即可 正常项目的 SourceReferenceResolver 都是存在的,尽…

纯 CSS 来计算当前窗口的宽高

在平时我想要计算浏览器窗口的宽度高度的时候,我们会使用 resize 事件去获取,也就是 JavaScript 的方式去获取窗口的宽度高度。 今天给大家分享一个使用纯 CSS 就能计算窗口宽度高度的方法定义自定义属性: 使用@property规则来定义--vw和--vh作为自定义的CSS属性。这些属性…

宏定义

宏定义 # 和 ## #号(将符号转为字符串) 这条定义中,定义了一个 PRINT 的宏函数预处理器遇到这样的宏,会将 #a 替换成以字符串表示的参数 a 例如:##号(连接符:将2个表达式连接到一起)预处理器会将这2条宏扩展成下面的代码我们可以看到:这2条宏定义其实就是定义了2个成员…

《Operating System Concepts》阅读笔记:p2-p8

《Operating System Concepts》学习第 2 天,p2-p8 总结,总计 7 页。 一、技术总结 1.operating system An operating system is software that manages a computer’s hardware。 2.system bus data bus, address bus, control bus 统称为 system bus。 二、英语总结(生词:…

踩坑---中断中调用系统定时器延时卡死

踩坑---中断中调用系统定时器延时卡死 背景 ​ 配置外部中断作为按键输入时,调用了系统滴答定时器为基准的延时。然后每次一按按键,单片机就卡死。一开始怀疑时中断没有配置好。反复研究中断配置是否出现错误,最后debug出来,发现卡在了// 3. 等待计数值变为0,判断CTRL标志…

windows 10 安装 wsl

在 windows 上安装 Debian 版本的 wsl以管理员身份运行 cmd,执行 wsl --help 可查看 wsl 的帮助信息。执行 wsl --list --online 查看可供安装的 wsl子系统 版本。执行 wsl --install --distribution Debian 安装 debian 版本的 wsl有了计划记得推动,不要原地踏步。

开学作业13

学习使用了vue中watch知识 可以实时更新数据 也非常好用

开学作业14

前几天也是这样通过打电话合作 前后端分着写 已经完成大部分前后端的交并 预计明天写完