2023 年 CCF 春季测试赛模拟赛 - 2 题解
T1 约数和
标准解法
\(n = a_1^{b_1} \times a_2^{b_2} \dots a_k^{b_k}\)
那么根据算术基本定理的推广,约数个数和约数和都是可以快速计算得到
约数和 sum
\(sum = (a_1^0 + a_1^2 + ...+ a_1^{b_1}) \times (a_2^0 + a_2^2 + ...+ a_2^{b_2}) \times ...\)
然后用等比数列求和把他们算出来即可
\((a_1^0 + a_1^2 + ...+ a_1^{b_1}) = \frac{a_1^{b_1 + 1} - 1}{a_1 - 1}\)
T2 文件查找
题意
有 \(n\) 个字符串 \(S_i\),全部由小写字母组成。
另有 \(m\) 个字符串 \(T_j\),除小写字母外,每个字符串中有且仅有一个 \(*\) 字符。
其中 \(*\) 字符能够匹配任意字符串(含空串)。
对每个字符串 \(T_j\),求有多少个字符串 \(S_i\) 能被匹配。
标准解法
警告:本题标准解法较为复杂,而前 90% 部分的解法更加简单易懂。
步骤 1
将所有 \(S\) 串正、反建出两棵「字典树」 \(\text{Trie}\)、\(\text{Trie}'\),将同一 \(S\) 的结束位置 \(end_S\)、\(end_S'\) 关联。
用 \(T\) 串 \(*\) 前的子串在 \(\text{Trie}\) 上匹配;\(*\) 后的子串的反串在 \(\text{Trie}'\) 上匹配。
若任何一匹配失败,则 \(T\) 不能与任何 \(S\) 匹配。
若均成功匹配,将在 \(\text{Trie}\)、\(\text{Trie}'\) 上得到的匹配结束位置分别记为 \(pos\)、\(pos'\)。
原问题转化为:求 \(\text{Trie}\) 中 \(pos\) 的子树中所有点的关联点在 \(\text{Trie}'\) 中 \(pos'\) 的子树中有多少个。
此问题能使用「DFS 序」解决。
步骤 2
\(\text{Trie}'\) 中 \(pos'\) 的子树在 \(\text{Trie}'\) 的 DFS 序中对应的区间为 \(\left[{dfn}_{pos'},{dfn}_{pos'}+{siz}_{pos'}\right)\)。
其中 \(dfn_{x}\) 表示 \(x\) 被 DFS 到的次序,\(siz_{x}\) 表示 \(x\) 子树的大小(节点数),这个序列使用「树状数组」维护。
当在 \(\text{Trie}\) 中 DFS 到 \(end_S\) 时,在 \(end_S'\) 对应的位置,即树状数组的 \({dfn}_{end_S'}\) 处 \(+1\)。
在 DFS 到 \(pos\) 时,首先(在包括上一段操作的所有操作之前)统计区间 \(\left[{dfn}_{pos'},{dfn}_{pos'}+{siz}_{pos'}\right)\) 的和,这部分是由不在 \(pos\) 子树中的 \(end_S\) 产生的,应在答案中减去。
之后递归 DFS \(pos\) 的子树,当 \(pos\) 的子树全部 DFS 完毕后,再次统计区间 \(\left[{dfn}_{pos'},{dfn}_{pos'}+{siz}_{pos'}\right)\) 的和,此次统计与第一次统计的差值就是 \(T\) 能够匹配的 \(S\) 串数量。
具体实现时,可以将询问用「链表」链接在对应的 \(pos\) 上。
时空复杂度
记 \(|S|=\sum length(s_i)\),\(|T|=\sum length(T_j)\)
时间复杂度:\(\mathcal{O}\left(|S|+|T|+m\log{|S|}\right)\)
空间复杂度:\(\mathcal{O}\left(|S|\right)\),常数约为 \(60\)
标准程序
代码长度:2460 详见 std
特殊性质与部分分
前 90%
「\(*\) 只出现在首或尾」,建出两棵字典树后求子树和即可。
其他部分分
出题人为各种其他奇奇怪怪的暴力提供了充足的数据梯度。
T3 吃糖
这道题的题意验题人视角也觉得比较难以理解,理解题意需要比较久的时间。
理解题意之后,判断完无解之后,发现这其实是一个有向图,每条边的转移是有概率的,问期望从起点多少步到达终止节点(终止节点可以有多个)。
用\(dp_i\)表示从\(i\)出发,期望需要多少步能够到达终止节点,那么:
\(dp_i=1+\sum_j(dp_j\times P_{i,j})\),\(j\)表示的是从状态\(i\)可以到达状态\(j\),\(P_{i,j}\)是状态\(i\)转移到状态\(j\)的概率。
直接对这个方程组做高斯消元,复杂度是炸裂的\(O((2^{11})^3≈8.5\times 10^9\)。
尽管我们可以在高斯消元的时候做一些常数优化(实际上最快的一次提交刚好是\(0.9\)s多一点),但还是难以通过。
考虑到这个转移图是一个很特殊的图,有着严格的层次:二进制下有\(k\)个\(1\)的状态,只会转移到二进制下有\(k\)或者\(k+1\)个\(1\)的状态,所以我们可以按二进制下的\(1\)从大到小,依次来做高斯消元,这样每一层的节点数只有\(2^k\)这么多,时间复杂度降为\(\sum_{i=0}^{n}(C_n^i)^3≈2\times 10^8\),实际上在消元的过程中我们可以只把第一行的其他位置消成\(0\),所以并不会达到上界。
T4 区间
显然 \(f(l,r)\) 等于 \([l,r]\) 中的数值种数。
\(a_i,l,r\) 随机的部分就是出现超过一次的数很少,答案与询问区间的差很小,在实际数据中两者的差 \(\le5\)。
考虑每次在序列尾部加入元素,求出加入每个元素后最短的子区间满足在整个序列中出现的数都在这个区间中出现过。
对于这个问题我们可以维护一个指针 \(p\),表示从 \(p\) 开始的后缀满足条件。添加元素 \(x\) 时,若 \(x\ne a_p\),则不对 \(p\) 做任何操作;否则,将 \(p\) 赋值为最小的 \(i\) 满足不存在 \(j>i\) 且 \(a_i=a_j\)。
容易证明这样维护总是正确的。
考虑原问题,令 \(pre_i\) 表示 \(a_i\) 上一次出现的位置,若不存在,则为 \(0\);\(nxt_i\) 表示 \(a_i\) 下一次出现的位置,若不存在,则为 \(n+1\)。
因为没有强制在线,所以离线。
枚举右端点 \(r\),对于每个 \(l\le r\),维护最大的 \(p_l\) 满足 \(f(p_l,r)=f(l,r)\)。
沿用在一个序列末尾添加元素的维护方式,每次将 \(r\) 右移时,若 \(pre_r\ne 0\),找出所有的 \(i\) 满足 \(p_i=pre_r\),将 \(p_i\) 赋值为最小的 \(j\) 满足 \(nxt_j>r\)。
由操作过程可得,\(p_i\) 单调不降。
可以用四元组 \((l,r,x,y)\) 表示右端点为 \(y\) 时,将 \(p_i(i\in [l,r])\) 赋值为 \(x\)。
我们对每组询问 \([u,w]\),可以用三元组 \((u,v,w)\) 描述,\(v\) 为最小的满足 \(f(l,v)=f(l,r)\) 的值。
容易发现,答案为 \(\min(v-(\min\limits_{u\le i\le v,nxt_i>v}i)+1,\min\limits_{l\le u\le r,v \le y \le w} (y-x+1))\)。
前一部分是平凡的,后一部分可以枚举 \(y\),操作转化为单点插入、单点求值、区间取 \(\min\)。
可以预处理出所有的 \(u\) 并离散化,使用线段树维护。
若 \(u\) 相同则无法正确维护,离散化时需强制两两不同。
设 \(n,m\) 同阶,时间复杂度 \(O(n\log n)\),空间复杂度 \(O(n)\)。
2023 年 CCF 春季测试赛模拟赛 - 2 题解的更多相关文章
- PAT团体程序设计天梯赛 - 模拟赛
由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 ...
- 4.28 省选模拟赛模拟赛 最佳农场 二维卷积 NTT
第一次遇到二维卷积 不太清楚是怎么做的. 40分暴力比对即可. 对于行为或者列为1时 容易想到NTT做快速匹配.然后找答案即可. 考虑这是一个二维的比对过程. 设\(f_{i,j}\)表示以i,j为右 ...
- 第 45 届国际大学生程序设计竞赛(ICPC)亚洲网上区域赛模拟赛. A.Easy Equation (前缀和/差分)
题意:RT,给你四个数\(a,b,c,d\),求\(x+y+z=k\)的方案数. 题解:我们可以先枚举\(x\)的值,然后\(x+y\)能取到的范围一定是\([x,x+b]\),也就是说这个区间内每个 ...
- [GRYZ]寒假模拟赛
写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优( ...
- 『2019/4/8 TGDay1模拟赛 反思与总结』
2019/4/8 TGDay1模拟赛 这次是和高一的学长学姐们一起参加的\(TG\)模拟考,虽然说是\(Day1\),但是难度还是很大的,感觉比\(18\)年的\(Day1\)难多了. 还是看一下试题 ...
- NOIP模拟赛-2018.11.7
NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...
- 体育成绩统计——20180801模拟赛T3
体育成绩统计 / Score 题目描述 正所谓“无体育,不清华”.为了更好地督促同学们进行体育锻炼,更加科学地对同学们进行评价,五道口体校的老师们在体育成绩的考核上可谓是煞费苦心.然而每到学期期末时, ...
- NOIP前模拟赛总结
NOIP前模拟赛总结 from 2018.10.7 to ??? Date Name Score(Rank) Problems 2018.10.7 McfXH AK Contest 42(?) 期望得 ...
- QHDYZ模拟赛20191012
今天信息处老师(并不是教练,基本等于机房看门大爷) (好吧老师其实很犇,软件什么的厉害的一批,只是不能带oi--) 跟我说:"xxj,过两天月考完了,可以在初赛前再整一次模拟赛,一天,三道题 ...
- 洛谷 P5594 【XR-4】模拟赛
洛谷 P5594 [XR-4]模拟赛 洛谷传送门 题目描述 X 校正在进行 CSP 前的校内集训. 一共有 nn 名 OIer 参与这次集训,教练为他们精心准备了 mm 套模拟赛题. 然而,每名 OI ...
随机推荐
- RedisTemplate设置redis的key时出现\xac\xed\x00\x05t\x00\x0f前缀
1.问题描述 使用redisTemplate设置redis的key-value,程序运行没有问题,但是却在redis客户端查不到设置的key-value. 2.产生原因 出现这种乱码前缀的原因是没有进 ...
- CTF-MISC方向涉及技术导图
MISC方向涉及技术导图
- 02-Sed语法介绍
1 Sed语法介绍 介绍Sed支持的基本命令及其命令行语法,Sed可以通过以下两种形式进行调用: 学习sed命令使用之前,需要掌握正则表达式的用法. sed [-n] [-e] 'commands' ...
- hashlib 模块 subprocess 模块 logging日志模块
今日内容 hashlib加密模块 1.何为加密 将明文数据处理成密文数据 让人看不懂 2.为什么加密 保证数据的安全 3.如何判断数据是否加密的 一串没有规律的字符串(数字.字母.符号) 4.密文的长 ...
- 探究BrainSplit-集群脑裂
本篇文章将会以redis集群为例,分享在主从集群中会导致数据丢失的一个问题:BrainSplit-集群脑裂 1.什么是集群脑裂 所谓的脑裂,就是指在主从集群中,同时有两个主节点,它们都能接收写请求.而 ...
- 【随笔记】XR872 Codec 驱动移植和应用程序实例(附芯片调试方法)
XR872 的 SDK 是我目前接触过那么多款 MCU 的 SDK 中,唯一一个将框架和 RTOS 结合的非常完美的 SDK .无论是代码风格还是框架的设计,看起来都很赏心悦目,而且是源码开源.希望能 ...
- 阿里百秀后台管理项目笔记 ---- Day03
来吧展示: step1:所有文章数据展示 引入 functions.php 文件执行数据库查询以及判断用户登录状态 require_once '../functions.php'; get_useri ...
- Django-request、django连接数据库、ORM
1.静态文件配置 1.静态文件:不经常变化的文件,主要针对html文件(CSS文件.js文件.img文件.第三方框架文件). 2.django针对静态文件资源需要单独开始一个目录统一存放:static ...
- Linux文件常用操作命令
Linux文件常用操作命令 一.Linux文件和目录简单操作 1.1 查看文件 ls 查看当前目录下的文件 如: -a 显示所有文件及目录 (ls内定将文件名或目录名称开头为"." ...
- Vue27 scoped样式
https://www.jianshu.com/p/d80383251fc5 1 简介 当我们在组件中写样式,vue最后会把所有样式合在一起,如果样式名称重复的话就会有问题 style标签上加scop ...