小题狂练 (I)

\[\newcommand{\occ}{\operatorname{occ}}\newcommand{\lcm}{\operatorname{lcm}} \]

目录

[Ynoi2009] pmrllcsrms / QOJ #5069. Vacation

\(c-1\) 分块(此处需要特判 \(c=1\)),块内线段树维护最大子段和,块间处理前面块的后缀和和后面块的前缀和后就是要算 \(\max\{a_x+b_y\}\text{ s.t. }x+y\le c\) . 可以通过将其中一个数组翻转将限制转为 \(x\le y\) 状物,那么线段树就随意维护了 . 时间复杂度 \(O(n+q\log n)\) .

关于 Ynoi 版本:别写动态开点,对每个线段树开一个 vector 存结点(对时间和空间都有优化).

[Ynoi2008] rsmemq

破解标题:rsmemq = range subrange mode equals median(?) query .

首先枚举中点,对于一个中点 \(x\) 来说能成为答案的区间最多 \(\occ(x)\) 段,那么考虑到 \(\sum\occ(x)=n\) 可以求出所有段然后通过数点统计答案 . 关于怎么求所有段:一看就归约矩乘直接考虑根号,对中点 \(x\) 的出现次数根号分治,

  • \(\occ(x)\le\sqrt n\):枚举每个 \(p=\occ(x)\),可以双指针对于每个 \(p\) 求出 \(l\) 后面第一个使得 \([l,r]\) 间众数出现次数为 \(p\) 的位置 \(r\),接下来可以简单求出答案 .
  • \(\occ(x)>\sqrt n\):由于最多只有 \(\sqrt n\) 个这样的位置所以暴力即可 .

这样可以 \(O(n\sqrt n)\) 求出所有段,接下来随便拆拆转为二维数点就结束了 . 时间复杂度 \(O(n^{1.5}+q\log n)\) .

[十二省联考 2019] 字符串问题

如果想做点连子树的优化建图,不需要使用线段树优化建图。。

[JOIST 2025] 救护车 / Ambulance

如果只有 1 维那么直接贪心就完了 . 对于 2 维的情况考虑按对角线划分:

  • \((1,1),(L,L)\):按 \(x+y\) 排序,一段前缀匹配 \((1,1)\)、一段后缀匹配 \((L,L)\) .
  • \((1,L),(L,1)\):按 \(x-y\) 排序,一段前缀匹配 \((1,L)\)、一段后缀匹配 \((L,1)\) .

那么如果知道分界点可以将点分为四部分,每部分匹配两个医院 . 求一系列背包 \(dp_{i,t}\) 表示某一组选前 \(i\) 个元素用时为 \(t\) 的情况下另一个医院的最小用时即可拼出答案,扫一个分界点对另一个分界点维护前后缀 DP 值就 \(O(n^2T)\) 解了 .

[NOI2025] 集合

世界名画之:D2T2 数据范围 \(n\le 20\)

首先一波子集反演容斥掉 \(f(P)=f(Q)\)\(t(S)\)\(S\) 的权值):

\[\mathrm{ans}=\sum_{T_1,T_2}(-1)^{|T_1|+|T_2|}2^{|T_1\cap T_2|}\sum_{f(P)\supseteq T_1}\sum_{f(Q)\supseteq T_2}t(P)t(Q)[P\cap Q=\varnothing] \]

如果再容斥 \(P\cap Q=\varnothing\) 明显会倒闭,此处应该考虑每个元素归入 \(P,Q\) 中的哪个:

\[\begin{aligned}&\mathrm{ans}=\sum_{A\cup B=B\cup C=C\cup A=\varnothing}(-1)^{|A|+|B|}2^{|C|}f(A\cup C)f(B\cup C)g(A\cup B\cup C)\\\text{where }&f(S)=\prod_{i\supseteq S}(1+a_i)\qquad g(S)=\prod_{i\supseteq S}\dfrac{1+2a_i}{(1+a_i)^2}\end{aligned} \]

由于 \(A,B,C\) 两两不交所以两个幂可以简单拆到 \(f,g\) 里面,接下来考虑到 \((A\cup C)\cup(B\cup C)=A\cup B\cup C\),只需使用 FWT 计算若干 OR 卷积即可获得答案 .

然而还有一个遗留问题,如果 \(a_i=-1\) 那么 \(g\) 会爆炸 . 考虑将每个 \(a_i\)\(\varepsilon\) 然后取 \(\lim\limits_{\varepsilon\to0}\) 计算答案,容易发现最后得到的分子分母都是关于 \(\varepsilon\) 的多项式,然而有理分式在 0 处的极限只和分子分母的最低次项有关,于是只需要维护最低次项就可以了(听说能证需要减法的时候减数一定低阶). 时间复杂度 \(\Theta(n2^n)\) .

CF1458F Range Diameter Sum

我超,RDS

[JOIST 2025] 集邮比赛 4 / Collecting Stamps 4

把每个元素第一次出现看成左括号、第二次出现看成右括号 . 那么相当于有一个 ()() 结构答案就 -1,每次操作找到一个 )( -> () 肯定能使答案 +1,所以只需要求出每个起点的初始种类数即可拼出答案,也就相当于是数 )( 结构的个数,可以随意维护 . 时间复杂度 \(O(n\log n+q\log q)\) .

[ARC202C] Repunits

唉还是写写吧,ARC 的时候和 xrlong 一直搞 B 没空做这题了,其实挺水的(

We recall that \(\gcd(a^n-1,a^m-1)=a^{\gcd(n,m)}-1\),而 \(R_n=\frac{10^n-1}9\),使用 min-max 容斥:

\[\mathrm{ans}=\prod_dR_d^{(-1)^{\#\{\gcd(S)=d,\,2\nmid|S|\}-\#\{\gcd(S)=d,\,2\mid|S|\}}}=\prod_dF_d^{(-1)^{\#\{d\mid\gcd(S),\,2\nmid|S|\}-\#\{d\mid\gcd(S),\,2\mid|S|\}}} \]

其中 \(\prod_{d\mid n}F_d=R_d\) . 后面那个指数根据二项式定理道理,当 \(A\)\(d\) 的倍数个数 >1 时会消掉,所以答案其实就是

\[\mathrm{ans}=\prod_{\exists i,\,d\mid A_i}F_d \]

接下来就很容易做到 \(O(A\log A)\) 了 .

[POI 2021/2022 R1] Druk

由于一个模板串长度 \(d\) 必然满足 \(d\mid n\) 或者 \(d\mid m\),于是可以枚举因数个数个可能的 \(d\) 并判断是否合法 .

断言:如果知道模板串是什么,那么从上往下、从左往右扫,能向右填就向右填,否则向下填 <- 这个策略是不劣的 .

证明可以考虑如果一个位置两种都能填,取这个位置所在的极长的一段向下填的段 . 如果这个段延伸到了末尾,那么显然模板串所有字符全部相同 . 否则这个位置的后一个位置一定向右填,从而前面向下的部分给出了模板串的一个 period . 而前面部分显然全部相同,从而模板串也全部相同 . 接下来可以简单推得原结论 .

于是直接模拟即可,时间复杂度 \(O(nm(d(n)+d(m)))\) .

[ICPC 2019 WF] Traffic Blights

相当于对每个前缀求通过概率 . 取 \(I=\lcm(1,2,\cdots,10)\),在 \({}\bmod I\) 意义下考虑问题 . 枚举 \(r\in[0,I)\),考虑到每个 \((k\cdot I+r)\bmod(r_i+g_i)\) 的循环节长度 \(\frac{r_i+g_i}{\gcd(r_i+g_i,I)}\)(在本题值域下)一定是素数幂,对于底数相同的合并到一起处理,接下来每部分的贡献独立可以直接相乘 . 由于循环节长度比较小所以组内可以随意做 .

时间复杂度 \(O(nIV)\),其中 \(V=\max\{r_i+g_i\},\,I\sim\lcm(1,2,\cdots,\sqrt V)=\mathrm e^{\sqrt V(1+o(1))}\) .

[JOI Open 2023] 花园 / Garden

如果枚举左右端点那么中间就是环上选一个最小的区间要求覆盖所有点,只需要求最大的空隙就可以了 .

那么可以想到枚举左端点(倒序)扫右端点动态维护,直接做会到达 \(O(d(d+n+m))\),可以使用一些去重的技巧做到 \(O(d^2)\) .

[JOISC 2020] 星座 3

如果做一个笛卡尔树状物,那么相当于给定若干点 - 叶子链,选若干条两两不交的链使得权值和最大 .

DP 可以直接考虑整体 DP,接下来可以使用线段树合并 / map 启发式合并维护 .

反悔贪心 由于其实有一个费用流对偶的建模(具体懒得写了自己想吧)所以可以考虑模拟费用流 = 反悔贪心 . 具体就是从下往上扫,每次考虑每个点删或者不删,如果不删的话预留一次反悔机会 . 整个过程可以使用树状数组简单维护 .

时间复杂度 \(O(n\log n)\) .

[JOISC 2024] 乒乓球 (Day4)

由剪刀石头布's trick 相当于限制度数平方和,而竞赛图的度数序列由 Landau 定理精确描述——

后面玄学调整法(?)就行了。。我暂且蒙在鼓里

CF1286E Fedya the Potter Strikes Back

border 理论指出,如果把所有 border 按其对应前缀的后继字符划分颜色段,最终只会得到 \(O(\log n)\) 段 .

那么考虑动态维护所有 border,每次加一个字符只会最多加一个元素并删除若干元素,在 border 树上按颜色链剖分即可以 \(O(\log n+\#\text{invalid})\) 的代价找到所有不合法的 border . 从而问题可以简单 \(O(n\log n)\) 解决 .

(jiangly 说这个找的过程其实是均摊 \(O(1)\) 的,但是我还不知道为什么)

QOJ #8479. Simple Math Problem

Solving the "simple math problem" with generating functions

CF1540D Inverse Inversions

手玩可以发现一个策略:如果知道第 \(i\) 个数前面有 \(a_i\) 个比它小的,问 \(p_x\) 是什么就相当于 \(t\) 遍历 \(x+1\dots n\),动态维护 \(v\)(初始 \(v=a_x\)), 如果 \(v\ge a_t\)\(v\gets v+1\),问最后 \(v\) 是什么 .

那么相当于带单点修改的对数据结构的爱模式区间函数复合,类似 STARGAZERS 高低位分治即可 \(O(q\sqrt{n\log n})\) .

CF1098D Eels

首先每次选最小的两个合并一定不劣(如果 \(A\le B\le C\) 那么 \(A+B\le 2C\)). 先将集合排序,如果某次操作 \(x\le y\) 是不危险的,也即 \(y>2x\),那么 \(x\) 肯定是由一段前缀合并而来 . 令 \(s\) 是前缀和则可以写为 \(2s_{i-1}<a_i\),此时显然 \(a_{i-1}\)\(a_i\) 的 highbit 不相同,从而如果按 highbit 将 \(a\) 分成若干块则不危险的合并一定发生在块间 . 对每个块开一个 multiset 维护即可,时间复杂度 \(O(q\log V)\) .

[AGC020D] Min Max Repetition

首先连续的相同字符个数的最大值最小显然是 \(v=\lfloor\frac{a+b}{\min(a,b)+1}\rfloor\),接下来注意到答案一定是一段 \((\texttt{A}^v\texttt B)^{\infty}\) 的前缀和一段 \((\texttt{B}^v\texttt A)^{\infty}\) 的后缀拼起来即可,分界点可以通过二分或者解不等式得到 .

CF1543E The Final Pursuit

第一部分:随便选一个点出来当 0 然后按最短路分层,第一层随意标 2 的幂,后面每个点标前驱的 OR .

第二部分:首先当且仅当 \(n\) 是 2 的幂有解(可以考虑 0 的个数可以数成 \(2^n/n\) 证明). 在标准表示上,一个点 \(i\) 的颜色是它有的所有位 \(2^b\) 对应的 \(b\) 的 XOR 和 . 由于排列整体 XOR 一个数仍然是排列所以有正确性 .

[COTS 2025] 数好图 / Promet

首先 \(k=n\) 的情况就相当于每个点入度和出度都不为 0,可以容斥掉一个限制解决:\(dp_{i,j}\) 表示 \(i\) 个点、钦定 \(j\) 个点入度为 0 的方案数,每次转移在开头加一个点 .

进而可以拼出每个 \(c=1\dots n\) 的答案 \(f_c\) . 对于 \(2\le k<n\) 的情况来说在 \(f_k\) 上分别加入不和 \(n\) 连通但是和 \(1\) 连通 + 不和 \(1\) 连通的方案数即可 . 至于 \(k=0,1\),前者答案和 \(k=2\) 一样、后者答案为 \(0\) .

时间复杂度 \(\Theta(n^2)\) .

[JOIST 2024] 滑雪 2 / Ski 2

DP 扫高度,动态维护活跃的接口个数和正在上升的元素个数 . 注意到一个数又升又建站肯定不优,所以建站的贡献可以简单算得 . 对高度离散化即可 \(\Theta(n^3)\) .

[JOI 2017 Final] 開拓

最后每个点贡献一个矩形的位置,考虑到最后肯定是两个矩形相撞或者矩形和边界相撞,其对应可以确定长或宽之一,那么可以找出 \(O(n^2)\) 个候选的长或宽(如果选别的调整到最靠近的肯定不劣). 接下来枚举长 \(a\) 单调指针枚举宽 \(b\),接下来改成以每个点为左下角作一个 \(a\times b\) 的矩形,判断其中是否存在 \(r\times c\) 的矩形 . 这样可以做到 \(O(n^4)\) .

若左右上下的风向次数是 \(a,b,c,d\),这里相当于扫描线扫 \(a+b,c+d\) . 此处应该改成扫描线扫 \(a+b,a\),这样另外一维可以写成一个类似于偏序的形式,可以扫描 单调队列动态维护信息 . 这样就 \(O(n^3)\) 了 .

[AGC002F] Leftmost Ball

考虑往空位上放数,每次放 \(k-1\) 个同样的颜色或者放一个白色,方案数可以通过组合数计算 .

[JOIST 2024] 鱼 3 / Fish 3

首先相当于每次给一个数减 \(d\) 问最少几次单调不降,令第 \(i\) 个位置操作 \(x_i\) 次,则有

\[x_i=\max\left(0,\left\lfloor\dfrac{a_i-(a_{i+1}-x_{i+1}d)}{d}\right\rfloor\right)=\max\left(0,\left\lfloor\dfrac{a_i-a_{i+1}}{d}\right\rfloor+x_{i+1}\right) \]

那么相当于是 \(c_i=\lfloor\frac{a_i-a_{i+1}}d\rfloor\),每次顺着做一轮 \(x\gets\max(0,x+c_i)\),问每个位置的 \(x\) 之和 .

那么只需要每次二分到 max 取到 0 的位置然后倍增即可 \(O((n+q)\log n)\) .

[JOISC 2022] 复兴计划

相当于边权是 \(|x-w_i|\) 的 MST,由于两个权值最多出现一次反超所以每个边权对一段区间的 \(x\) 产生贡献 . 按边权从大到小加入每条边动态维护 MST,同时 \(x\) 从大向小移动 . 加入一条边 \((u,v,w)\) 时,找到对应树上边权最大的边 \((u',v',w')\) 替换,同时标记分界点 \(\lfloor\frac{w+w'}2\rfloor\) . 由此即可找到每个点贡献的区间,接下来简单扫描线即可统计答案 .

时间复杂度 \(\tilde O(nm+q)\),使用数据结构(如 LCT)维护可以变快 .

[JOIST 2025] 多方通信 / Multi Communication

  • Subtask 1:trivial .
  • Subtask 2:倍增,顶层不维护,下放的时候初始有最高层信息,总计 4+4 = 8 轮 .
  • Subtask 3:学习 Subtask 2,改成顶层分 3 层,查询的时候需要 +1 轮 .

[JOI Open 2025] 心灵感应 / Telepathy

[JOIST 2023] 传送带 / Belt Conveyor

每次按深度 mod 3 分组选最牛的一组问,可以确定每个点的一条邻边,这样是 \(\log_{1.5}n\) 次 .

[ARC146E] Simple Speed

不填空位,扫值域插入维护当前序列,\(dp_{i,j,0/1,0/1}\) 表示考虑 \(1\dots i\)、有 \(j\)\(i\) 是相邻的、最左边 / 最右边是不是 \(i\) .

由于每层只有 \(O(1)\) 个状态,所以总共只有 \(O(n)\) 个状态,从而可以 \(O(n)\) 解决 .

CF1149C Tree Generator™

根据去月球相当于求一个区间让不匹配的括号尽量多,由于把 ( 换成 1、) 换成 -1 之后不匹配的括号个数就是选一个位置分开 最大的后面减前面,所以线段树维护即可 .

[ARC108E] Random IS

在二维平面上看相当于每次随意选一个点然后进入左下角和右上角的子问题,随时 bound 住的位置由选择的左右端点决定,那么首先可以写出一个简单的 \(O(n^3)\) DP .

按区间长度从小到大转移,把式子拆成一些一侧端点固定的和式,树状数组优化即可 \(O(n^2\log n)\) .

QOJ #6555. Sets May Be Good

双倍经验:ABC220H .

首先 (奇+偶) trivial,只需要算 (偶-奇) . 令 \(\bm x_i\) 表示选不选 \(i\),那么就是要算:

\[\sum_{\bm x}(-1)^{\bm x^{\sf T}A\bm x} \]

其中 \(A\) 是邻接矩阵,运算在 \(\mathbb F_2\) 下进行 . 这种题有两种转化途径:

  • 对称:\(A_{j,i}\gets A_{i,j}+A_{j,i}\)\(A_{i,j}\gets 0\) .
  • \(A\gets Q^{\mathsf T}AQ\)(也就是对行做变换的时候要同时对列做对应的变换).

可以通过以下流程将 \(A\) 转为下双对角矩阵(也即只有 \(A_{i,i},A_{i,i-1}\) 有值):

  1. 对称,让第一行只有第一个数有值 .
  2. 找一个 \(A_{i,1}=1\) 的位置换到第二行(列也要换),如果找不到直接转 4 .
  3. 用第二行消后面的每一行(列也要消),让第一列只有第二行有值 .
  4. 把第一行和第一列删了递归进入子问题 .

使用 bitset 优化可以做到 \(O(n^3/w)\) . 对于下双对角矩阵的情况可以随手 \(O(n)\) 算出 .

QOJ #2068. Fast as Ryser

如果 \(n\) 是奇数就把 \(n\) +1 . 加若干条 \((2i-1)-2i\) 的虚边,则最后的匹配和虚边联合构成若干环 / 链 . 同时如果数出若干环 / 链的方案,把虚边删掉即立得匹配的方案 .

显然只需要对一个环 / 链做(集合幂级数)exp . 单个链是平凡的,单个环可以在环上的最小标号处断开然后统计,也即 \(dp_{S,i}\) 表示集合 \(S\) 链头为 \(\min S\)、链尾为 \(i\) 的答案,如果链头和链尾能接起来那么构成一个环 .

时间复杂度 \(O(2^{n/2}n^2)\) .

CF1188E Problem from Red Panda

相当于每次给一个 \(a\)\(k-1\) 别的 \(a\) 都减 \(1\) . 令位置 \(i\) 操作 \(x_i\) 次,则最后每个 \(a_i\) 会变成 \(a_i+nx_i-\sum x\),也就是 \(x_i\ge\lfloor\frac{\max(\sum x-a_i,0)}k\rfloor\),可以得到 \(\sum x\ge\sum_i\lfloor\frac{\max(\sum x-a_i,0)}k\rfloor\) .

由于某些原因这个条件是充要的,那么枚举 \(\sum x\) 再插板就能数 \(x\) 了 . 关于为什么要数 \(x\),因为把每个位置都操作一遍相当于什么也没发生,从而显然不同的 \(a\)\(\min x=0\)\(x\) 双射 .

时间复杂度 \(O(n+\max a)\) .

[AGC055F] Creative Splitting

学习 Kubic 大神的记号先把 \(k\) 改成 \(m\) .

首先有一个简单的判定策略:维护 \(b_{1\dots n}\),初始都等于 \(m\) . 倒着扫 \(a_i\),每次找到最小的 \(b_j\ge a_i\) 然后让 \(b_j\) -1 . 如果能做到最后就合法 .

显然过程中 \(b\) 单调不降,那么考虑差分 \(c_i=b_i-b_{i-1}\) 就相当于维护序列 \(c\),每次选一个 \(c_i\) -1 同时 \(c_{i+1}\) +1,并贡献 \(c_i\) 的方案数 . 进而有一个组合意义:有 \(m\) 个有标号球,初始都在 1,每次选一个球往右移动,让所有球都到右边 .

对于询问 \((x,y)\),枚举第 \(nm-x+1\) 步操作的位置 \(t\),则需要 \(\sum_{i=1}^{t-1}c_i<y\le\sum_{i=1}^tc_i\) . 差分改成 \(\#(y\le\sum_{i=1}^tc_i)-\#(y\le\sum_{i=1}^{t-1}c_i)\) 算就只有一边的限制了 .

将过程分为两个阶段 \(1\dots nm-x,\,nm-x+1\dots nm\),令 \(dp_{t,i,j,k}\) 表示 \(i\) 个球、有 \(j\) 个球在第一阶段结束后位置 \(\le t\)、有 \(k\) 个操作在第一阶段的方案数 . 每次转移加一个球并枚举它在第一阶段的操作次数即可 . 这样就可以求了 .

时间复杂度 \(O(n^3m^3)\) .

P13835 【MX-X18-T7】「FAOI-R6」返夏

魔怔,低秩扰动是 Matrix Determinant Lemma,加行 / 列是 Schur 补 . 具体可以看看官方题解 .

posted @ 2025-07-18 20:43  yspm  阅读(104)  评论(0)    收藏  举报
😅​