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 题解的更多相关文章

  1. PAT团体程序设计天梯赛 - 模拟赛

    由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 ...

  2. 4.28 省选模拟赛模拟赛 最佳农场 二维卷积 NTT

    第一次遇到二维卷积 不太清楚是怎么做的. 40分暴力比对即可. 对于行为或者列为1时 容易想到NTT做快速匹配.然后找答案即可. 考虑这是一个二维的比对过程. 设\(f_{i,j}\)表示以i,j为右 ...

  3. 第 45 届国际大学生程序设计竞赛(ICPC)亚洲网上区域赛模拟赛. A.Easy Equation (前缀和/差分)

    题意:RT,给你四个数\(a,b,c,d\),求\(x+y+z=k\)的方案数. 题解:我们可以先枚举\(x\)的值,然后\(x+y\)能取到的范围一定是\([x,x+b]\),也就是说这个区间内每个 ...

  4. [GRYZ]寒假模拟赛

    写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优( ...

  5. 『2019/4/8 TGDay1模拟赛 反思与总结』

    2019/4/8 TGDay1模拟赛 这次是和高一的学长学姐们一起参加的\(TG\)模拟考,虽然说是\(Day1\),但是难度还是很大的,感觉比\(18\)年的\(Day1\)难多了. 还是看一下试题 ...

  6. NOIP模拟赛-2018.11.7

    NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...

  7. 体育成绩统计——20180801模拟赛T3

    体育成绩统计 / Score 题目描述 正所谓“无体育,不清华”.为了更好地督促同学们进行体育锻炼,更加科学地对同学们进行评价,五道口体校的老师们在体育成绩的考核上可谓是煞费苦心.然而每到学期期末时, ...

  8. NOIP前模拟赛总结

    NOIP前模拟赛总结 from 2018.10.7 to ??? Date Name Score(Rank) Problems 2018.10.7 McfXH AK Contest 42(?) 期望得 ...

  9. QHDYZ模拟赛20191012

    今天信息处老师(并不是教练,基本等于机房看门大爷) (好吧老师其实很犇,软件什么的厉害的一批,只是不能带oi--) 跟我说:"xxj,过两天月考完了,可以在初赛前再整一次模拟赛,一天,三道题 ...

  10. 洛谷 P5594 【XR-4】模拟赛

    洛谷 P5594 [XR-4]模拟赛 洛谷传送门 题目描述 X 校正在进行 CSP 前的校内集训. 一共有 nn 名 OIer 参与这次集训,教练为他们精心准备了 mm 套模拟赛题. 然而,每名 OI ...

随机推荐

  1. Linux基础守护进程、高级IO、进程间通信

    守护进程(Daemon) 前言 Linux常用于服务器,程序通常不运行在前台.运行于前台的进程和终端关联,一旦终端关闭,进程也随之退出.因为守护进程不和终端关联,因此它的标准输出和标准输入也无法工作, ...

  2. misc之套娃编码解密

    题目: 01100101 01100110 00100000 01100010 01100101 00100000 00111001 01100110 00100000 01100011 011001 ...

  3. 基于 Traefik 如何实现 path 末尾自动加斜杠?

    前言 Traefik 是一个现代的 HTTP 反向代理和负载均衡器,使部署微服务变得容易. Traefik 可以与现有的多种基础设施组件(Docker.Swarm 模式.Kubernetes.Mara ...

  4. Linux 环境中使用 LVGL

    之前有记录过在 esp32 中使用 LVGL 的笔记,需要的小伙伴可以了解一下,esp-idf 移植 lvgl8.3.3 我之前整理的学习资料:https://www.cnblogs.com/jzcn ...

  5. 《Kubernetes Operator 开发进阶》- 作者絮絮叨

    目录 今天聊啥 本书读者 推荐序 推荐序1 - 邓洪超 推荐序2 - 任晶磊 推荐语 推荐语1 - 张磊 推荐语2 - 宋净超 推荐语3 - 王泽锋 推荐语4 - 周鹏飞 推荐语5 - 郑东旭 本书简 ...

  6. 一份前端够用的 Linux 命令

    前言 你好,我是悦创.我用 VuePress 搭建博客,又实现了 GitHub 和 Gitee Pages 的自动部署,但我最终还是决定自己建站,而在建站的过程中,必不可少会用到 Linux 命令,所 ...

  7. [Unity]Update()与FixedUpdate()

    Update()介绍 首先我们从官方文档的介绍了解: MonoBehaviour.Update() Description Update is called every frame, if the M ...

  8. 看不懂打我系列------图文并茂基于CentOS Linux release 7.8.2003 Core安装并Docker化你的Node.js应用

    @图文并茂基于CentOS Linux release 7.8.2003 Core安装并Docker化你的Node.js应用 简体中文 | English 说明 本文介绍如何在CentOS Linux ...

  9. drf-序列化字段及参数、序列化和反序列化高级用法、ModelSerializer使用

    1.序列化类常用字段和字段参数 1.1 常用字段类 1.BooleanField 2 NullBooleanField 3 CharField CharField(max_length=None, m ...

  10. linux09-分区挂载

    1.Linux分区简要介绍 Linux来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构 , Linux中每个分区都是用来组成整个文件系统的一部分. Linux ...