NOIP 模拟赛
2024.8.3 校内模拟
link。
\(100+100+0+20=220\)。
Problem A. T1 / P9350 [JOI 2023 Final] Advertisement 2
考虑 \(\left| p_i - p_j \right|\) 非负,但是 \(a_i - a_j\) 可以为负数。考虑必然是按照 \(a\) 从大到小操作。于是排个序之后维护单点修改区间最值的线段树即可。
Problem B. T2 / JOISC 2018C Tents
模拟赛出的加强版。
问题转化如下:
给定 \(n,m,k\),在 \(n\times m\) 网格中选至少一个关键点,使得对于任意关键点,同行或同列的其他关键点至多只有一个。选出关键点后对关键点染色,如果同行同列都没有其他关键点,则有 \(k\) 种颜色可选。否则如果同行同列有恰好一个其他关键点,则只有 \(1\) 种可选。问最终染色方案数对 \(10^9+7\) 取模的结果。\(1 \leq n,m \leq 3000\)。JOISC 原题中 \(k=4\)。
考虑枚举 \(i\) 表示有多少个关键点是同行同列什么都没有,即有 \(k\) 种颜色。那么有 \(\dbinom{n}{i} \dbinom{m}{i} i!\) 种选法,乘上 \(k^i\) 即为这些点染色方案数。问题在于还有 \(n-i\) 行 \(m-i\) 列怎么办。
考虑 DP,记 \(f_{i,j}\) 表示填 \(i\) 行 \(j\) 列且不存在任意一个关键点有 \(k\) 种染色方法时的答案。即每个点同行与同列总共恰好有一个关键点。转移时考虑右下角 \((i,j)\) 选不选,第 \(i\) 行选几个,第 \(j\) 列选几个即可转移,虽然有些复杂,但每一类都不难得到式子。复杂度 \(O(nm)\)。
Problem C. T3 / P9055 [集训队互测 2021] 数列重排
\(f(0)\) 容易求出,考虑 \(f(i)\) 怎么求。
首先容易观察到 \(0 \sim i-1\) 应该周期地选,多出来的那些应该正好匹配。例如现在填 \(0\sim 4\),\(2,4\) 多了一个,\(k=2\),应该填 \(2,4,0,1,3,2,4,0,1,3,2,4\),此时任意长度大于等于 \(i\) 的区间都合法。
通过一系列观察可以得到 \(\geq i\) 的数必然只会插入在段之间或者两侧。记 \(x_j\) 表示第 \(j\) 段之前插入数量。考虑此时插入到段 \(j\) 时,贡献为 \(len-2\times(i-1)-x_j\),并让 \(x_j\) 加一。
而在两侧时,贡献则是 \(len-x_j-(i-1)\)。同时也要让 \(x_j\) 加一。
\(len\) 可以等差数列求和,只考虑后面减去的贡献,按照减去的小到大选即可。发现中间段都等价,把两侧的先各插入 \(i-1\) 次后均匀插入所有即可。复杂度线性。
Problem D. T4 / P7324 [WC2021] 表达式求值
建立表达式树。考虑 \(f_{u,S,0/1}\) 表示现在遍历了 \(u\) 为根的子树,目前考虑的数在 \(n\) 个数中哪些数比他大,目前的答案是小于或大于等于这个数。然后就可以直接 DP 了。
2024.8.4 梦熊 NOIP 13 连测 #4
link。
\(65+100+10+20=190\)。
Problem A. T1 魔法师
题意:给定一个 \(n\) 个点的有向完全图和数 \(m\),每条边有两个权值 \(a_i\) 和 \(b_i\)。找到一条从任意点出发,任意一点结束,经过所有点恰好一次的路径,满足路径中 \(b\) 边权和不超过 \(m\),同时最小化 \(a\) 边权和。在上述条件下最小化路径字典序。
范围:\(3 \leq n \leq 18\),边权随机生成,\(m\) 为一条随机路径为基础在边权和附近随机取值。
解法:
赛时没想到爆搜。
看着很不可做。考虑搜索剪枝。
先状压 DP 一下。记 \(f_{S,i}\) 表示现在已经经过 \(S\) 中的点,现在在点 \(i\),在不管 \(b\) 的和时,将所有点走完需要的最小 \(a\) 之和。同理 \(g_{S,i}\) 表示不管 \(a\) 的情况下最小花费的 \(b\) 的和,剪枝就很轻松了。
写完发现跑得挺快,又由于大样例也是随机的,所以就过了。
Problem B. T2 二叉搜索树
题意:
给定一棵 \(n\) 个点的以 \(1\) 为根的二叉树,每个点有点权,有 \(q\) 次操作,每次修改一个点的点权,然后询问全局有多少点满足以其为根的子树是一棵二叉搜索树。这里的 BST 是不严格的,即可以满足等于。
范围:\(n, q \leq 2 \times 10^5\)。
解法:
吊打标算。
考虑一个点为根的二叉树是 BST 的充要条件,显然是中序遍历不降排序。
解法 1
标程做法。
考虑每次修改点权只会影响这个点到根的路径,同时发现如果一个点为根的子树不是 BST,那么其到根的路径上每个点子树都不是。
单点修改时考虑倍增或者二分查询其祖先的一段极长合法段即可。问题转为判定性问题。相当于单点修改,判断区间是否不降排序。树状数组维护 \(a_i > a_{i+1}\) 的数量即可。复杂度 \(O(n \log^2 n)\),可以通过。
解法 2
我的赛时做法。
显然问题不强于一个序列,初始时给定若干区间,每次单点修改后问有多少区间不降排序。
考虑使用 set 维护极长不降段,每次单点修改只设计到 \(O(1)\) 个区间合并分裂,只需要维护二位数点就可以更新答案。这里可以主席树或者离线下来树状数组,复杂度 \(O(n \log n)\)。
Problem C. T3 枚举
很厉害的题。
问题等价于你有 \(2^k-1\) 个物品,物品有价值,每种物品无限量选取。有 \(k\) 维限制,每个限制都是若干物品选取的数量和为一个定值。在满足条件情况下最大化价值总和。\(2 \leq k \leq 4\)。
直接考虑 \(k=4\),\(k<4\) 时可以直接补全成 \(k=4\)。
考虑类数位 DP。记 \(f_{i,j,a,b,c,d}\) 表示当前考虑到了二进制第 \(i\) 位,当前在决策物品 \(j\),现在四个容量剩余分别是 \(a\times 2^i, b\times 2^i, c\times 2^i,d\times 2^i\)。这样可以直接转移。
但是这个复杂度其实不太对。问题在于 \(a,b,c,d\) 的上限。粗略分析可以得到 \(15\) 这个上限,但还不足以通过,事实上根据奇妙分析可以得到 \(a,b,c,d \leq 7\),即可通过。
Problem D. T4 树
题意:
一棵有根树,需要支持加一个点,以及给定一个点 \(x\),对于 \(x\) 子树内每个点 \(u\),求出 \(\prod \limits_{u} f(u)\) 对 \(998244353\) 取模的结果。其中 \(f(u)\) 表示将 \(u\) 所有儿子的子树按照同构划分成等价类,每个等价类的元素个数阶乘之积。
不强制在线,\(n \leq 3 \times 10^5\)。
解法:
DDP。
2024.8.6 校内模拟
link。
\(100+100+100+0=300\)。
Problem A. T1 塔楼 / P8161 [JOI 2022 Final] 自学
简单二分,不过多赘述。
Problem B. T2 网络 / JOISC 2019 D4T2
对于每种颜色,找出所有此颜色的点并按照 DFS 序排序,相邻的两个做链加 \(1\)。其实就等价于建出虚树后把所有虚树上经过的点覆盖掉。
此时考虑原树边 \((u,v)\),如果这条边没被覆盖过,就在新树上增加一条 \(col_u\) 与 \(col_v\) 的边。显然合并两个集合等价于新树上做链覆盖。于是问题转化为新树上用最小的链覆盖所有边,答案显然等于 \(\lceil \dfrac{leaf}{2} \rceil\),特别注意新树只有一个点的情况。
Problem C. T3 数字 / JOISC 2019 D3T1
注意到可以钦定先进行区间覆盖操作再进行区间取反,且任意两次区间覆盖的区间没有交集。
然后直接设计状态 \(f_{i,0/1,0/1,0/1}\) 表示前缀 \([1,i]\) 已经符合条件,且末尾 \(i\) 是否处于被覆盖 \(0\),被覆盖 \(1\),和被区间取反。转移是朴素的,复杂度线性。
Problem D. T4 核心 / P9248 [集训队互测 2018] 完美的集合(弱化版)
先考虑怎么求最大值。
直接枚举题目中的那个 \(u\),那么每个点是否可选可以简单判定。问题转成了树上选一个包含根的连通块,满足 \(\sum \limits_{x \in S} w_x \leq m\),最大化 \(\sum \limits_{x \in S} v_x\)。直接树上背包可以做到 \(O(nm^2)\),复杂度瓶颈在于背包合并。无法通过。
考虑把背包拍到 DFS 序上,\(f_{i,j}\) 表示考虑 DFS 序中 \([1,i]\) 的点,目前 \(\sum w_x=j\) 的最大 \(\sum v_x\)。转移要么选择这个点,转移到 \(f_{i+1,j+w}\),要么跳过整个子树,转移到 \(f_{i+sz,j}\),这样合并背包变成了添加一个数,就做到了 \(O(nm)\)。加上枚举中心,复杂度为 \(O(n^2m)\)。
那么计数呢?考虑在上面的 DP 中同时记录方案数,但是这样会被算重。发现对于固定的集合 \(S\) 来说,合法的中心必然也是一个连通块,而对于树来说,点数减边数等于一。于是可以枚举每条边,计算两端点都能成为中心的方案数,直接把两个答案相减即可。复杂度不变。
2024.8.8 校内模拟
link。
\(100+0+100+60=260\)。
Problem A. T1 平方数
题意:给定正整数 \(n\) 的质因数分解,求正整数对 \(a^2-b^2=n\) 的解的数量的两倍对 \(10^9+7\) 取模的结果。多测。
范围:\(t \leq 1000\),\(n\) 的质因数分解中至多只有前 \(100\) 个质数。
解法:
如果 \(n\) 是 \(2\) 的倍数但是不是 \(4\) 的倍数,答案显然为 \(0\)。
注意到 \(a^2-b^2=(a+b)(a-b)\),即求 \(xy=n\),\(x,y\) 同奇偶且 \(x \neq y\) 的方案数。
考虑每个奇质数贡献都是其次数加一,特别考虑下 \(2\) 的贡献就行。
Problem B. T2 括号路径 / P10572 [JRKSJ R8] +1-1
首先显然的三个必要条件是,\(x,y\) 连通。\(x\) 是左括号,\(y\) 是右括号。 \(x\) 到 \(y\) 至少有一条长度为偶数的路径。
前两个条件可以简单判断,第三个条件可以考虑其反面,即 \(x\) 到 \(y\) 只有长度为奇数的路径。此时 \(x,y\) 所属连通块应该是二分图,且 \(x\) 和 \(y\) 颜色相同。
然后考虑 \(x\) 能怎么到 \(y\)。发现可以先走若干 () 然后走 ((,走了一段之后回到 )),然后再通过若干 () 到 \(y\),手玩一下发现很对。
接着就简单了,先只保留所有两端点括号不同的边,维护一下连通块,然后标记所有 (( 的连通块是可以走出去的,以及 )) 连通块可以走进来,然后就可以直接判断了。
Problem C. T3 数据结构是一种艺术 / P10642 [BalticOI 2022 Day1] Art Collection
简单交互。
我们先问 \([1,2,\cdots,n]\),然后问每个循环移位。
发现每移位一次我们就可以知道移位前最左边的数所在位置。具体来说考虑方程 \(x+y=n-1,x-y=\Delta\) 的解即可。\(\Delta\) 为两次询问的逆序对个数差。
这样我们只需要询问 \(n\) 次即可得到答案。
Problem D. T4 向流星许愿 / P10149 [Ynoi1999] XM66F 改
修改范围:\(n, q \leq 10^6\),时限 \(15\) 秒,空间限制 \(128\) MB。
解法:
考虑莫队。以右端点右移为例,考虑做法。
向右添加一个数 \(a_r\),会与目前区间 \([l,r)\) 中每个 \(a_x = a_r\) 的数产生 \([x,r]\) 中比 \(a_x\) 小的数的个数的贡献。考虑把这个东西差分,变成 \([1,r]\) 内比 \(a_r\) 小的个数减去 \([1,x]\) 内比 \(x\) 小的个数。这个东西可以一开始树状数组简单维护,之后拓展时只需要记录同种数的和以及个数就可以直接转移了。复杂度 \(O(n \log n + n \sqrt{q})\)。
赛时没细想,写了个依靠维护第一个数和最后一个数的回滚莫队,常数巨大,喜提 \(60\)。
2024.8.10 校内模拟
link。
\(100+10+0+10=120\)。
Problem A. T1 战争 / P4734 [BalticOI 2015] Hacker
发现只要先手后手的第一步都确定了,那么每个点属于谁自然也确定。
枚举先手的第一个位置,后手会选择环上任意一个长度一半的不包含先手第一个位置的区间选,这里直接单调队列或者使用 multiset 等数据结构维护即可。
Problem B. T2 迷宫 / JOISC 2014 D2T2
问题等价于求 \(k\) 个关键点构成完全图的 MST。
考虑多源广搜,同时从所有点开始拓展,当两个拓展接触时连边,然后跑 Kruskal 即可。
Problem C. T3 排序 / JOI Final 2013 T5
显然冒泡排序次数为逆序对个数。
交换 \(i,j\) 时逆序对的变化量是经典问题。
容易观察到最优解必然有 \(a_i\) 是前缀最大值,\(a_j\) 是后缀最小值。
仔细观察发现对于每个 \(i\) 来说,最优选择的 \(j\) 单调不降。于是可以分治,计算答案使用主席树即可。复杂度 \(O(n \log^2 n)\)。
Problem D. T4 分裂 / CF1874E Jellyfish and Hack 改
不会。
2024.8.11 梦熊 NOIP 13 连测 #5
link。
\(100+30+50+20=200\)。
喜欢原题不改题面?喜欢不放大样例?喜欢 T4 大样例输入格式错误?
Problem A. T1 or / [AGC015D] A or...or B Problem
题意:给定 \(a,b\),求在 \([a,b]\) 中任选至少一个正整数进行按位或,得到的结果有多少种。
解法:
考虑分类讨论。显然如果 \(2^i\in[a,b]\),那么二进制按位或下第 \(i\) 位可以随便选或不选。若 \(2^i>b\),显然怎么样都不能选。否则 \(2^i\) 必然是跟着一个 \(2^j\) 一起选,然后分类讨论一下几种情况,例如 \(a=2^k\),或者 \(a\) 和 \(b\) 二进制最高位位置相同以及一些其他情况,代码不是很好写,赛时花了约两个小时才写完。
Problem B. T2 array / CF1295F Good Contest
梦熊范围 \(n \leq 500\)。
很简单的一个题吧。赛时基本都写对了,但是没大样例导致我以为过了。
考虑先离散化,显然离散化后每一段的 DP 可以一起处理。
考虑 \(f_{i,j}\) 表示当前考虑了前 \(i\) 个数,离散化后第 \(j\) 段的答案和。转移似乎很简单,但是细想发现你不好处理例如 \(i-1\) 选的数和 \(i\) 是否是同一段的。考虑枚举极长后缀 \([k,i]\),钦定 \([k,i]\) 选的数都是 \(j\) 区间的。这样可以直接通过 \(f_{k-1,j+1}\) 的后缀和与一个组合数转移而来。直接爆算组合数是 \(O(n^4)\) 的,发现这里的组合数可以直接 \(O(1)\) 递推到下一个。预处理逆元就可以做到 \(O(n^3)\) 了。
Problem C. T3 walk
题意:给定一个 \(n\) 个点 \(m\) 条边的有向强连通图,不保证无重边自环。每条边上有字符 ( 或 ),判断是否存在从任意一个点开始,经过每条边至少一次的回路,使得依次写下路径经过的字符后字符串是一个括号匹配的序列。
范围:\(n \leq 4000\),\(m \leq 8000\),\(3\) 秒,\(512\) MB。
解法:
将 ( 视作 \(1\),) 视作 \(-1\)。
手玩一些样例,发现如果图中即存在正环也存在负环,或者不存在负环也不存在正环,则存在这样的回路。写写发现就能对了,为什么呢?
考虑如果存在正环也存在负环,对于任意一条回路,都能在之前加任意多个 ( 和 ),使括号平衡。同时如果不存在正环也不存在负环,那么无论怎么走括号都平衡。但是只有正没有负的时候,或者只有负没有正的时候,总是平衡不了。使用 SPFA 或 Bellman-Ford 进行负环判定就可以做到 \(O(nm)\),即可通过。
Problem D. T4 apple
题意:
给定 \(n\) 个点的无权树,有一些关键点。你可以任选一个关键点 \(s\) 和任意一个距离 \(d \in [0,n]\),将树上所有距离 \(s\) 不超过 \(d\) 的节点构成的集合视作关键集合。问树上有多少本质不同关键集合。
范围:\(n \leq 2 \times 10^5\),时限 \(3\) 秒。
解法:待补。
2024.8.14 校内模拟
link。
\(100+100+40+30=270\)。
Problem A. T1 reverse / P8431 「WHOI-2」彗星蜜月 改编
题意:
多测。定义 \(f(x)\) 表示将 \(x\) 十进制下的数反转后去除前导 \(0\) 得到的数。每次询问给定 \(x\),求最小的正整数 \(m\),使得 \(f(m)>x\)。
范围:\(T \leq 10^5\),\(1 \leq x \leq 10^{18}\)。
解法:
你发现答案大概率都是 \(1000……0\),最后加上一个 \(x\) 的第一个数加上 \(1\)。
但是 \(x\) 前面是 \(9\) 怎么办?发现应该找到极大前缀 \(9\),然后对后面的部分做这样的操作,然后在后面补同样多的 \(9\)。
有一些细节,例如 \(1000\) 或 \(9999\) 这样的需要进行一些分类讨论。
Problem B. T2 card / P6674 [CCO2019] Card Scoring 弱化
题意:给定 \(n\) 个数的序列 \(a\),将序列分为若干非空子段,使得每个子段的众数的出现次数平方和最大。
范围:\(n \leq 10^6\),时限 \(1\) 秒,空间限制 \(512\) MB。
解法:
经典的观察是对于最优解中每一段 \([l,r]\),总是有 \(a_l=a_r\)。
朴素的做法是直接 DP。记 \(f_i\) 表示当前把 \([1,i]\) 这段前缀分成若干段,且最后一段结尾就在 \(i\) 的最大答案。显然答案为 \(f_n\)。
考虑转移,在计算 \(f_i\) 时,枚举 \(j\) 使得 \(j<i\) 且 \(a_{j+1}=a_i\),记 \([j+1,i]\) 中和 \(a_i\) 相等的有 \(c\) 个,则贡献为 \(f_{j}+c^2\)。对每个 \(i\) 将所有 \(j\) 贡献取 \(\max\) 即可。
看见 \(c^2\),一眼就是斜率优化。将 \(c\) 改为前缀和形式,发现这个 DP 的斜率单调,使用单调队列维护上凸包就可以做到 \(O(n)\) 的复杂度了。
Problem C. T3 order / P10353 [PA2024] Grupa permutacji 弱化版
随机化,不会。
Problem D. T4 group / P7881 [Ynoi2006] rmpq
Ynoi,不会。
2024.8.18 梦熊 NOIP 13 连测 #6
link。
\(100+0+100+73=273\)。
没大样例,T2 有向边建成无向边挂 \(100\) 分!
Problem A. T1 Alice 的数
题意:给定 \(l,r\),定义函数 \(f(x)\) 返回 \(y\) 使得 \(\left| x - y^2 \right|\) 最小。对于 \([l,r]\) 中的每个 \(i\),若 \(f(i)\) 是奇数,贡献为 \(i\),否则贡献为 \(-i\)。求 \([l,r]\) 贡献之和。
范围:\(1 \leq l \leq r \leq 10^18\)。
解法:
很简单的一个题。观察到每个数的正负号是有规律的,按照形如 \(2,4,6,8,10,\cdots\) 为周期,然后容易推出来整周期的答案。零散周期直接等差数列求和就好。复杂度 \(O(\log r)\) 或者 \(O(1)\)。
Problem B. T2 Bob 的图
题意:
给定 \(n\) 个点 \(m\) 条边的带权有向图,对于每个点 \(i\),求 \(1\) 到 \(i\) 所有最短路经过的边数的两两乘积之和对。求所有 \(i\) 的答案和对 \(10^9+7\) 取模的结果。
范围:\(1 \leq n,m \leq 2\times 10^5\)。
解法:
很简单的一个题。类似最短路计数。在 Dijkstra 过程中维护 \(1\) 到每个点最短路数量,所有最短路经过边数和,以及对应的答案。所有转移都可以 \(O(1)\) 进行。复杂度 \(O(m \log n)\)。
Problem C. T3 维护整数列
题意:
维护长度为 \(n\) 的整数序列(可能有负数),支持单点修改,区间除法(下取整,可能除以负数),区间求和,区间平方求和。答案对 \(10^9+7\) 取模。
范围:\(1 \leq n, m \leq 10^5\)。
解法:
典中典势能线段树。除以 \(1\) 是无用的,除以 \(-1\) 相当于区间每个数取相反数,容易用懒标记维护。同时维护区间最小和最大值,就可以上势能线段树了。
Problem D. T4 大头问题
题意:
给定 \(n,m,k\) 和一个 \(n\) 个点 \(m\) 条边的无向图。对于 \(S \subseteq \{1,2,\cdots,n\}\),记 \(x\) 为 \(\sum \limits_{i=1}^m [u_i \in S] \land [v_i \in S]\),求 \(\sum x^k\) 对 \(10^9+7\) 取模的结果。
范围:\(1\leq n, m\leq 10^5\),\(1 \leq k \leq 3\)。
解法:
将 \(x^k\) 视为 \(x\) 个数有序选 \(k\) 个的方案数,分类讨论。\(k \leq 2\) 是容易的。\(k=3\) 大概要维护三元环计数以及一些其他的东西。
2024.8.20 校内模拟
HARD Round.
link。
\(30+40+0+75=145\)。
咕咕咕。
2024.8.22 校内模拟
link。
\(100+100+100+40=340\)。
Problem A. T1 light
题意:
给定一个 \(n \times m\) 的网格,每个点可能是空地,障碍或者光源。所有光源会向上下左右四个方向发出光线,光线会一直延申直到网格外或者遇到障碍。求有多个空地或光源被至少一条光线照射到。
范围:
\(1 \leq n, m \leq 2000\)。
解法:
很显然。对每行每列正反各做一次,总共四次就好。复杂度 \(O(nm)\)。
Problem B. T2 train / CF1935E Distance Learning Courses in MAC
解法:
考虑对于每个 \(l_i\) 和 \(r_i\),把二进制下的 LCP 弄出来后先求一个区间 OR。现在默认所有 \(l_i\) 和 \(r_i\) 最高位都不同。
考虑怎么进行询问。先求出区间 \([l,r]\) 中的 LCP 的按位 OR 结果,记目前答案为 \(ans\)。这里可以预处理每一位的前缀和或者使用各种数据结构维护。
考虑从高到低遍历每一位,如果 \(ans\) 这一位是 \(0\)。看一下是否存在至少两个 \([l,r]\) 内的数能选这一位,如果能的话把一个选上,另一个选 \(i\) 后面的后缀,就可以让后面全都是 \(1\)。否则只有一个,往后看看能替换多少。不存在就跳过。
如果 \(ans\) 这一位是 \(1\),那如果存在就后面全都变为 \(1\) 了,否则跳过。根据实现不同复杂度在 \(O(n \log V)\) 到 \(O(n \log^2 V)\) 不等。
Problem C. T3 fill / CF1852D Miriany and Matchstick 加强
模拟赛题中需要求字典序最小的构造。
一个想法是每次能填 A 就填 A,不然填 B。用 DP 记录一段后缀所有能取到的结果。复杂度 \(O(n^2)\)。
一个猜测是如果后缀能取到的最小值是 \(l\),最大值是 \(r\),那么 \([l,r]\) 都能取到。但是很遗憾这个是假的,考虑第一行为 AAA,对第二行构造,至少结果为 \(0\),至多为 \(4\)。但是无论如何 \(1\) 都构造不出来。
于是猜测另一个结论,对于 \([l,r]\) 来说,只有 \(l+1\) 和 \(r-1\) 可能取不到。手玩若干个发现很对。然后写一个基于这个结论的 DP 就可以通过此题。复杂度线性。
Problem D. T4 end / P5398 [Ynoi2018] GOSICK
解法:
考虑二次离线莫队。现在考虑加入右端点如何处理贡献。
显然我们要求这段区间中是某个数的倍数或因数的数的个数。其中倍数是很好做的。二次离线下来之后对于每个数 \(O(\sqrt{n})\) 枚举因数就能做到 \(O(1)\) 查询。
因数不好考虑。考虑根号分治。设阈值为 \(B\)。大于等于 \(B\) 的数可以暴力跳倍数进行处理。对于小于 \(B\) 的,发现我们做二次离线的时候,事实上处理的是 \(O(m)\) 个前缀对 \(O(m)\) 个连续区间的贡献。预处理每个小于 \(B\) 的倍数前缀和以及出现次数前缀和就可以解决询问。但是这个题重度卡常,目前的实现还没有通过。
2024.9.8 梦熊十三连测 #8
Problem A. T1 F
显然发现一个关于 \(\lfloor \dfrac{2^n}{3} \rfloor\) 的递推式。然后用矩阵快速幂即可。
Problem B. T2 la
等价于计算一些置换环长度的最小公倍数的和。
注意到 \(m \leq 100\),而和为 \(100\) 的数的不同 \(\operatorname{lcm}\) 个数并不多。直接 \(O(2^k)\) 硬算然后容斥一下就行。
Problem C. T3 z
没使用 freopen,\(100 \rightarrow 0\),警钟长鸣。
很简单的,考虑操作本质可以干什么。事实上可以观察到最终每个 \(b_i\) 应该等于 \(a_i\) 与之前若干个数异或。
考虑 DP,记 \(f_{i,j}\) 表示前 \(i\) 个数,最后的 LIS 以 \(i\) 结尾,LIS 长度为 \(j\) 时最小的结尾是什么。通过维护线性基即可转移。
Problem D. T4 e
直接做是很难想的,因为对序列的任意排列使得 DP 无法钦定方向。尝试分析一些答案的性质但无果。
考虑在值域上 DP。具体地,先对 \(a,b,c\) 分别进行离散化。考虑 DP。记 \(f_{i,j,k}\) 表示考虑 \(a \leq i, b \leq j, c \leq k\) 的所有人的答案。现在考虑转移。
以 \(f_{i,j,k}\) 转移到 \(f_{i+1,j,k}\) 为例。考虑所有 \(a\) 排名为 \(i\) 的那些 \(a,b,c\)。若不满足 \(a\leq i+1,b \leq j, c \leq k\) 则忽略。否则将 \(b\) 移成 \(j\),\(c\) 移成 \(k\) 必然最优。复杂度 \(O(n^3)\)。
2024.9.22 梦熊十三连测 #10
link。
\(100+100+100+30=330\)。
Problem A. T1 小 C 玩扑克
注意到区间的 \(l\) 单调递增,所以从前往后考虑每个 \([i,r_i]\),当此时第 \(i\) 张牌反面朝上时做一次翻转即可。使用差分即可做到线性。
Problem B. T2 小 C 写代码
解法 \(1\):注意到数据随机,考虑一个神秘做法。当 \(i \leq B\) 时暴力,\(i > B\) 时直接广搜。取 \(B=600\) 可以通过。
解放 \(2\):不基于数据随机。设 \(f_S\) 表示目前集合离 \(S\) 的修改距离最小是多少。添加字符串直接广搜更新。因为每个字符串更新次数不超过 \(m\),复杂度应该为 \(O(n + m2^m)\)。
Problem C. T3 对称数之和
直接思考很难。首先有一个显然的 \(O(\sqrt{n})\) 做法。但是不够优秀。
考虑如果我已经确定了在进行 \(x+y\) 求和的每一位是否进位,那么 \(x\) 与 \(y\) 的每一位之和就已经确定。你发现此时如果 \(x\) 和 \(y\) 长度不同,则 \(x\) 和 \(y\) 是唯一确定的。如果长度相同,可以直接计算答案。这样的复杂度应该是 \(O(2^{\log_{10} n} \operatorname{polylog}(n))\) 的,可以通过。
Problem D. T4 徒步计划
考虑预先 DP 处理出 \(f_{i,j,k}\) 表示目前的数可以表示为 \(x \times 10^j+k\),其中 \(k \in [0,9]\) 且 \(x\) 的各位数字最大为 \(i\) 时,进行 \((x+1) \times 10^j + k'\) 的 \(k'\) 以及步数。这部分可以递推处理。
然后就变成了处理循环节的问题,每次从一个小于 \(0\) 的数继续往后走,复杂度 \(O(\operatorname{polylog}(m))\)。
十一短训 #1
link。
\(100+0+40+5=145\)。
Problem A. 白露澈明之泉
题意:
给定一个 \(n \times n\) 的 \(01\) 矩形 \(c_{1,1},\cdots,c_{n,n}\),你每次可以选择一行,将其从左到右复制到某一列从上到下上。问最少多少次操作可以将矩形变成全 \(1\)。保证有解。
范围:\(1 \leq n \leq 3000\)
解法:
容易发现最优操作必然形如先将某行全变为 \(1\),然后将每个还有 \(0\) 的列变为 \(1\)。
考虑枚举这一行 \(x\),分类讨论第 \(x\) 列上是否还有 \(1\) 即可。总复杂度 \(O(n^2)\)。
Problem B. 在空无一物的时光深处
题意:
给定 \(n\) 个数 \(c_1,\cdots,c_n\) 和 \(m\)。有一个长度为 \(m\) 的数轴,数轴上每个位置有一个数,初始全为 \(0\)。你可以随便选择一个起点 \(s\),然后依次对于 \(i=1\) 到 \(n\)。选择将 \([s-c_i+1,s]\) 或 \([s,s+c_i-1]\) 都覆盖为 \(i\),如果区间超过 \([1,m]\) 则不能进行这个操作。然后将 \(s\) 变成对应覆盖区间的另一个端点。求最后有多少本质不同的数轴。
范围:\(1 \leq n, m \leq 150\)。
解法:
对于区间覆盖,考虑逆着做。
问题变成,最后有一个任意终点 \(e\),对于 \(i\) 从 \(n\) 到 \(1\),你可以将 \(e\) 加上或减去 \(c_i\),然后将没覆盖那部分覆盖上。问最终本质不同的结果数量。
考虑一个 DP,记 \(f_{i,j,0/1}\) 表示现在已经考虑了 \([i,n]\) 的所有颜色,目前已经覆盖的区间长度为 \(j\),且现在终点在区间最左端或右端的答案。为什么可以钦定终点在左侧或右侧?这是为了避免算重,只考虑所有有效的操作,即进行了覆盖的操作。这些操作必然满足最后终点到了 \(l\) 或 \(r\)。
对于 \(f_{i,j,0/1}\),可以转移到 \(f_{x,k,0/1}\),其中 \(1 \leq x < i, 1 \leq k < j \leq m\),同时要满足一个背包的性质。直接暴力做背包就可以得到一个 \(O(n^4)\) 的做法。注意到转移有若干偏序,常数很小,可以通过。
Problem C. 烟花
原题链接。
Problem D. 神谕
不会。
炼石计划 NOIP 模拟赛 #10
link。
Problem A. 字符串
题意:
给定长度为 \(n\) 的小写字符串 \(s\),求有多少本质不同前缀与后缀拼接,原串不算入。
\(1 \leq n \leq 5 \times 10^5\)。
解法:
首先长度不同的字符串本质不同,考虑对于同一个长度 \(l\),计算有多少重复的。发现对于中间删掉一段 \(s[i,i+l-1]\) 与 \(s[j,j+l-1]\) 得到的前缀后缀拼接相同,当且仅当 \(\forall k \in [i,j), s_k = s_{k+l}\)。对于每个 \(l\),找到所有 \(k + l \leq n\) 且 \(s_k = s_{k+l}\) 的位置,这些位置开头的串都是有重复的,记这样的位置有 \(cnt\) 个,答案加上 \(n-l+1-cnt\) 即可。
进一步,对于字符集的每种字符计算,不用枚举长度,复杂度 \(O(n)\)。
Problem B. 别回头
题意:
给定 \(n\) 个点 \(m\) 条边的简单无向图以及起点与终点 \(s,t\),\(q\) 次询问,每次给定 \(k\),求有多少条从 \(s\) 到 \(t\) 的长为 \(k\) 的路径,且不连续经过一条边两次,答案对 \(998244353\) 取模。
\(3 \leq n \leq 200\),\(0 \leq q \leq 100\),\(0 \leq m \leq \dfrac{n(n-1)}{2}\),\(1 \leq k \leq 10^9\)。
解法:
朴素做法是 \(f_{i,j,k}\) 表示经过了 \(i\) 条边,到了点 \(j\),上一个点为 \(k\) 的方案数。用矩阵快速幂转移,复杂度不低于 \(O(n^6 \log k)\),显然无法通过。
考虑优化状态。记 \(f_{i,j}\) 表示经过了 \(i\) 条边,到了点 \(j\) 的方案数。转移形如 \(f_{i,j} = \sum \limits_{(k,j) \in E} f_{i-1,k}-deg_jf_{i-2,j}\),后面减去的是最后一条边重复经过两次的方案数。
考虑矩阵套矩阵,将 \(f_{i}\) 与 \(f_{i-1}\) 放入一个行或列向量,每次乘上一个 \(2 \times 2\) 的矩阵矩阵即可做到 \(O(qn^3 \log k)\),仍然不能通过。初始时预处理 \(G^{2^x}\),询问时不需要矩阵乘矩阵只需要向量乘矩阵,可以通过。
Problem C. 分组
题意:
有 \(2n\) 个人,你需要将其平方为两组。有 \(m\) 个限制,第 \(i\) 个限制给定 \(u_i,v_i\),表示这两个人不希望在同一组,否则会产生 \(2^i\) 的不满意度。试构造一组方案,在不满意度最小的情况下,分组字典序最小。只需要输出构造。
\(1 \leq n \leq 5000\),\(m \leq 10^6\)。
解法:
简单题。
对于权值为 \(2^i\) 的东西,肯定是从大到小依次满足。维护并查集判断二分图,但是问题在于就算图是二分图,我们也需要判定是否能平分。具体来说考虑每个连通块,因为是二分图,所以每个连通块有两个数 \(a_i,b_i\),目标变为判定能否在每个连通块中选一个数,使得总和为 \(n\)。容易发现本质只有 \(n- 1\) 次判定,每次都跑一个背包可以做到 \(O(\dfrac{n^3}{w})\),估计过不去。考虑将 \(01\) 背包转成计数背包,每次做的只有删除和加入常数个物品,多选几个模数或者选一个大模数即可。
对于字典序最小,也是按照顺序贪心做带删除背包,复杂度 \(O(n^2+m\alpha(n))\)。
Problem D. 最短路
题意:
给定 \(n\) 个点的无边权的树,\(q\) 次询问,每次给定 \(k,s,t\),构造一个无向图 \(G\),点集和树的点集一样,\((u,v)\) 有边当且仅当树上距离 \(dis(u,v) \geq k\)。然后询问 \(G\) 上 \(s\) 到 \(t\) 的最短路,不连通输出 \(-1\)。
\(1 \leq n,q \leq 10^6\),\(3\) 秒。
解法:
容易发现答案要么是 \(-1\),要么不超过 \(3\)。因为只需要从 \(s\) 出发,往直径端点上走就行了。答案为 \(1\) 或 \(-1\) 是很好判的。考虑判定答案为 \(2\)。
将直径拉出来,我们要找一个点 \(x\),满足 \(\min\{dis(u,x),dis(v,x)\} \geq k\)。这个点要么是直径端点,要么必为直径上某个点的某个儿子子树中最深的点,然后将这个式子列出来,发现是一个 \(\min(a+d_x-d_u,b+d_y-d_x)\) 形式,这个最小值存在一个分界点,分界点可以二分求出,然后变成了区间 RMQ 问题,复杂度 \(O(n \log n)\)。
云斗学院 2024 S 组模拟
\(100+100+75+30=335\),但是得到了 rk1?
Problem A. >-<
题意:
请自行阅读。
解法:
阅读理解题。答案为所有左右分别是 > 和 < 的位置的不同数个数。
Problem B. 步行回家
题意:
有 \(n\) 个点,标号为 \(1\) 到 \(n\),你现在位于 \(n\) 号点,若你现在在点 \(x\),你可以选择:
- 若 \(x > 1\),走到 \(x-1\)。
- 若 \(x<n\),走到 \(x+1\)。
- 选择正整数 \(d \mid n\),走到 \(d\)。
你不能到达某个位置多次,你也不能连续三次选择的操作种类依次为 \(1\),\(3\),\(1\)。问有多少种从 \(n\) 走到 \(1\) 的路径,两条路径不同当且仅当路径某个位置不同或某次选择的操作种类不同。答案对 \(998244353\) 取模。
\(1 \leq n \leq 10^5\),时限 \(1\) 秒。
解法:
考虑整个移动过程,其实可以将其按照操作 \(3\) 分段,段与段之间只能前后移动。于是考虑记一个 DP,\(f_{i,j}\) 表示最后一步操作是从 \(i\) 的倍数 \(j\) 走过来的方案数,但是这样不能处理连续三次操作的限制。于是多记一个 \(0/1\),表示最后两步操作是否为 \(13\)。直接转移需要枚举 \((i,j)\) 之间的数,复杂度大概为 \(O(n^2 \ln n)\),无法通过。注意到其实可以整除分块,但是还是带个 \(\ln\) 之类的,还是太菜了。但是如果我们倒着转移,从 \(f_{i,j,0/1}\) 转移到 \(f_{k,i,0/1}\),其中 \(k \mid i\),那么在计算所谓的 \((i,j)\) 之间的数时,我们并不要求起点 \(>j\),因为我们是倒着转移的。这样我们维护单点修改区间求和就能通过本题了。
Problem C. 魔法序列
题意:
给定一个长为 \(n\) 的整数序列 \(a_1,a_2,\cdots,a_n\),然后给 \(q\) 次询问,每次给定 \(l,r,x\),求 \(\max \limits_{i=l}^r (a_i \operatorname{OR} x)\)。其中 \(\operatorname{OR}\) 表示二进制下或运算。
特别地,保证 \(a_1 < a_2 < \cdots < a_n\)。
\(1 \leq n, a_i, q, x < 2^{20}\),时限 \(3\) 秒。
解法 \(1\):
对着题解念一遍。
我们考虑先将询问离线。
我们建立两棵 0-1 Trie,第一棵插入值域内所有数,且从低到高位插入。第二棵将所有 \(a_i\) 插入。然后我们考虑在第一棵上 DFS,在每个叶子节点求所有 \(x=val_{leaf}\) 的答案。在 DFS 过程中,我们在第二颗树上动态维护每个数和目前的值的按位或。可以发现在第一棵树上往 \(1\) 的边走,其实是在第二棵树上将所有这一位为 \(0\) 的子树加 \(2^k\)。又由于序列单增,所以询问直接类似线段树查询区间 \(\max\) 即可。由于两棵树建立方向相反,所以复杂度为 \(O(\sum \limits_{i=0}^{20} 2^i2^{20-i+1})=O(V \log V)\),可以通过。
解法 \(2\):
这个做法是 \(O(V \log^2 V)\) 的,但依赖递增性质是不是有点菜了!
我们考虑从高到低贪心,每次询问变为给定 \(k\),判定区间内是否存在一个数二进制下是 \(k\) 的超集,即包含 \(k\)。
但是这个问题好像有点难啊。但是你别急,考虑什么东西能刻画这种东西。虽然所有数不同,但枚举子集复杂度也太差了,空间显然也不对。但是你考虑你可以 FWT!你希望对于每个值域内的数,维护一棵线段树,线段树上每个位置 \(i\) 的权值为 \(0/1\) 表示 \(a_i\) 是否为这个数的超集。FWT 的时候你只需要维护线段树合并。因为你做的是贪心,所以必须在线处理询问,线段树合并时要可持久化一下。这样空间太烂了,只能过 \(n < 2^{18}\) 的 \(75\) 分,但确实不依赖于递增的性质。这也是我赛时写的做法。
Problem D. 最短路的一集
据说来自 CTT 模拟赛哦。

浙公网安备 33010602011771号