ZROI 19.08.12模拟赛

传送门

写在前面:为了保护正睿题目版权,这里不放题面,只写题解。



“我发现问题的根源是大家都不会前缀和。”——敦爷


  • A

敦爷spj写错了,差点把蒟蒻swk送走

\(50pts:\)

考虑不输出方案怎么做。显然是树形dp。

设\(f_{i,j,\{0/1/2\}}\)表示\(i\)的子树中,有\(j\)条链,根节点状态为:\(\{\)没选\(/\)选了向下的一条链\(/\)选了向下的两条链\(\}\)的最优解。

对于一棵子树,开始时只考虑根节点,依次合并每个儿子。合并时需要枚举父亲和儿子的状态,用\(size\)限制枚举上界,可以证明复杂度是\(O(nk)\)的。

转移的时候分别讨论各个状态之间的转移即可。

\(100pts:\)

输出方案也不难,只需要记录每个状态依次从哪个儿子的哪个状态转移来即可。

可以把转移方向放在儿子上,避免复杂的可持久化。

当然写起来就是另一回事了

复杂度证明:

合并大小分别为\(x,y\)的两棵子树,复杂度为\(O(\min(x,k)\cdot \min(y,k))\)。

不妨设\(x\geq y\),对两棵子树的三种情况分别分析。

①\(x\geq k, y\geq k\),则单次复杂度\(O(k^2)\),但这样的子树最多\(\frac{n}{k}\)棵,总复杂度\(O(nk)\)。

②\(x\geq k, y < k\),发现每个节点最多合并进\(size\geq k\)的子树一次,即整棵树上每个零散节点最多产生\(O(k)\)的复杂度,总复杂度\(O(nk)\)。

③\(x<k,y<k\),对于一个节点,最多与\(O(k)\)个节点合并后,子树大小就会\(\geq k\),因此每个节点最多产生\(O(k)\)的复杂度,总复杂度\(O(nk)\)。


  • B

\(60pts:\)

对于一次操作\([x,y]\),区间\([l_i,r_i]\)被访问的充要条件是:\([x,y]\)与\([l_i,r_i]\)有交;\([x,y]\)不完全包含\([l_i,r_i]\)的父亲。

由此可以得到一个\(O(nq)\)的算法,即对线段树上的每个节点分别统计访问次数。实现时有很多分类讨论,比较复杂。

\(100pts:\)

对于\(O(nq)\)算法里的分类讨论,每种讨论实际上都可以提取出一个关于\(x,y\)的低次多项式。

发现如果区间\([l_i,r_i]\)被\([x,y]\)包含,则它的每一个子区间都被其包含。因此整个子树可以规避分类讨论,预处理多项式系数即可。

即询问时遇到完全包含的节点可以直接退出,复杂度等同于线段树区间询问,\(O(n+q\log n)\)。


  • C

\(60pts:\)

发现\(h_{i+1}-h_i\)等于\(i\)位置结束的每个子串的\(G_i\)之和,即\([1,i]\)每个前缀的末尾增加了一个字符。

把\(n\)个后缀拉出来跑kmp,维护一下前缀和即可。

\(100pts:\)

对于字符串\(A\),\(f_i\)的含义其实是\(A[1…i]\)的border(相等的前后缀)个数。

由此得到\(G_A\)的含义是\(A\)的每个前缀出现的次数\(-1\)之和,因为每次枚举到这个前缀第一次出现以外的位置时,都会产生一次border的贡献。

再考虑\(h_{i+1}-h_i\),即\(\sum_{j=1}^i G_{S[j…i]}\)的意义,发现对于\(S[1…i]\)的每个子串,设其出现次数为\(d\),产生的贡献为\(\frac{d(d-1)}2\)。

用后缀自动机维护,每次加入新字符时,等价于\(fail\)树上到根节点的链\(+1\),可以离线树剖或者LCT维护。

原文地址:https://www.cnblogs.com/suwakow/p/11375094.html

时间: 2024-08-01 02:01:14

ZROI 19.08.12模拟赛的相关文章

ZROI 19.08.07模拟赛

传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. "正睿从来没有保证,模拟赛的题目必须原创." "文案不是我写的,有问题找喵老师去."--蔡老师 A R爷再次翻车,搞出来了一道六年前的CF题. \(100pts:\) 然而不是原题也很简单,斜率优化板子,单调队列搞一下就完事了. 也可以wqs二分,复杂度可以做到\(O(m\log m)\),\(与\)p\(无关.所以R爷差点把\)p$出到\(10^5\). B 本题乱搞做法非常多,所以R爷动用了权限来

ZROI 19.08.10模拟赛

传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. A \(20pts:\) 枚举操作序列然后暴力跑,复杂度\(O(6^n)\). \([50,80]pts:\) 枚举改成dfs,每层操作后还原.复杂度\(O(3^n)\). 全0或全1可以直接返回. 写法优秀可以过\(80pts\). \(100pts:\) 类似非递归fft的写法,bitrev后可以位运算优化. 最下面四层可以预处理,复杂度\(O(3^{n-4})\). 然后疯狂卡常就完事了( 然而由于swk人菜常数大,明明所有

ZROI 19.08.09模拟赛

传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. A \(70pts:\) 维护一个栈,从一侧向另一侧扫描,如果新加入的元素与当前栈顶相同,则出栈,否则进栈.显然一个子串是括号序列,当且仅当栈为空. 枚举起点,暴力模拟即可.复杂度\(O(n^2)\). \(100pts:\) 对于一个右端点,考虑哪些左端点可以和它匹配. 发现所有合法的左端点,两者栈的内容都是相等的,可以Hash判断. 实际上考虑每次加入字符时,只会在末尾变动一次,可以用trie树维护.复杂度\(O(\sigma

ZROI 19.08.11模拟赛

传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. dlstql,wsl A \(10pts:\) \(a=100,T=100\),对每个排列构造一个反的,一步到位即可. \(20pts:\) \(a=50\),构造\(1\)和所有元素交换的排列,实现交换\((v,u)\)可以令两者分别与\(1\)交换,选择排序即可. \(40pts:\) \(a=30\),构造前\(25\)个元素与\(1\)交换的排列,另有一个排列交换前\(25\)个与后\(25\)个元素. \(a=20\)时

ZROI 19.08.04模拟赛

传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. "这应该是正睿OI历史上第一次差评破百的比赛." "这说明来正睿集训的人越来越多了." "我很不能理解差评,因为在比赛开始前就有超过\(40\)个差评了." 天祺鸽鸽nb! A "这题标程是线性的,可是为什么没有出\(5\times 10^6\)呢?因为spj要带个\(\log\),这样就T了." \(100pts:\) 打表观察发现有解当且仅当\(\sum k

ZROI 19.08.05模拟赛

传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. A \(21pts:\) 随便枚举,随便爆搜就好了. \(65pts:\) 比较显然的dp,设\(f_{i,j,k}\)表示在子树\(i\)中,两个赞助商分别选了\(j,k\)个的最优解. 对枚举的上下界卡的紧一点,按照树上背包的聚合分析,复杂度是\(O(n^3)\)的,可以通过. \(100pts:\) 观察数据范围可以发现,这题的子树大小限制可以抽象成一个经典的网络流模型. 跑一个最大费用流就好了. 我写丑了,每个点拆了\(5

ZROI 19.08.08模拟赛

传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. 首先恭喜swk今天翻车! "小心大样例演你."--天祺鸽鸽 果然swk今天被大样例演死了,天祺鸽鸽诚不欺我! A 这题标程是前几天ACM赛的双栈背包-- 然而可以排序之后直接背包,\(O(nm)\)随便过( B 菜 swk 菜 发现答案就是子串中最长border,即串长减去最短循环节. 每个字母是独立的,可以分开计算答案. 对第\(i\)个字母,设循环节循环次数为\(k\),在循环节内的长度为\(f_i\),剩余的长度为

2014.11.12模拟赛【最小公倍数】| vijos1047最小公倍数

最小公倍数(lcm.c/.cpp/.pas) 题目描述 给定两个正整数,求他们的最小公倍数. 样例输入 28 12 样例输出 84 数据范围 对于40%数据:1<=a,b<=10^9 对于60%的数据:1<=a,b<=10^12 对于100%数据:1<=a,b<=10^100 提示:为了略微降低题目难度,增加以下条件: 1. 输入数据保证a>=b 2. 输入数据保证a.b没有前导0 3. 输入数据保证除了在两个正整数a.b之间的空格和行末换行符以外,不存在其他非数

2014.11.12模拟赛【最大公因数】

最大公因数(gcd.c/.cpp/.pas) 题目描述 给定正整数n,求. 样例输入 6 样例输出 15 数据范围 对于40%的数据:1<=n<=1000000 对于100%的数据:1<=n<=3*10^12 提示:保证答案不超过10^18 原创题! ……好吧其实最后发现bzoj2705[longge的问题]跟这个一毛一样,但是这个数据更强 不过我真是独立yy出来的 首先,考虑gcd(i,n)==k的i有几个 显然这是等价于gcd(j,n/k)==1的j有几个,其中1<=j&