8 月记录

AT_arc168_f [ARC168F] Up-Down Queries

给定长度 \(n\) 的序列 \(x_i\in [0,M]\),对这个序列进行:

准备一个长度 \(M\) 的全 \(0\) 序列 \(y\),依次 \(i=1\to n\)

  • \(j\in [1,x_i],y_j\leftarrow \max(0, y_j-1)\)
  • \(j\in (x_i,M],y_j\leftarrow y_j+1\)

每次对 \(x\) 单点修改,输出最后序列 \(y\) 的和。

\(1\le n,M,Q\le 2\times 10^5\)


\(y_i\) 单增,考虑维护差分序列。

前缀 \([1,x_i]+1\), 后缀 \((x_i,M]-1\)

考虑维护斜率变化点,每次考虑就是加入两个 \(x_i\),然后删除最小值,最后只需知道集合数的和。

删除最小值变成删除任意值,可以变为一个费用流模型。

维护单向链,\(S\to i\)\((2,x_i)\)\(i\to T\)\((1,0)\),其具体意义为:从左往右扫,加入两个流量,然后将最小的流量流出,最后剩下的流量原路返回!!!

考虑模拟费用流,每次修改一条边的费用,而始终是最大流,故每次只能找一个环增广,发现只能增广含 \(x_i\) 的环。

向左向右找权值最小的合法环即可。

线段树上维护正反边流量及权值。


P5841 [CTSC2011] 字符串重排

给定 \(n\) 个两两不同字符串 \(s_i\),定义一个排列的价值为相邻串 LCP 的平方和。

还有 \(q\) 个附加奖励,在满足最大价值的前提下,若满足 \(x_i\) 恰好在 \(y_i\) 相邻前面,则有 \(2^i\) 的奖励。

求最大价值以及最大奖励。

\(q,L\le 2\times 10^5\)


发现排列一定是 trie 的一个 dfs 序。

防止前后缀关系,额外给每个 \(s_i\) 加上一个独立的字符,这下每个截止点都是叶子了。

对于奖励任务,就是要求每个点在 dfs 序中相邻。

从大到小进行检查,限制为:钦定 \(u\) 的某个儿子 \(v\) 是第一个经过的,最后一个经过的,或者钦定 \(v_1\) 恰好在 \(v_2\) 前。

考虑用链表维护,找若干条件即可。

注意到可以缩链,可以证明这样最大深度为 \(\mathcal O(\sqrt L)\)


AT_wtf22_day1_d Welcome to Tokyo!


P13757 【MX-X17-T6】Selection

定义序列 \(A>B\) 当且仅当 \(A_i\ge B_i\),且存在 \(A_i>B_i\)

求对 \(n\) 个长度为 \(m\) 的数组填 \([1,v]\) 的数的方案数,使得可以选出 \(k\) 个数组 \(S\),使得 \(\forall i\in S,j\notin S\) 都有 \(A_i>A_j\)

\(n\le 4000, m\le 10^9,v\le 10^9\)


钦定 \(a\)\(k\) 个大于后 \(n-k\) 个,最后乘上 \(\binom {n}{k}\)

然后每个位置需要确定最小值,然后后 \(n-k\) 个要求为 \(\le\),但是不能同时有前 \(k\) 个、后 \(n-k\) 个全部位置都等于最小值的数组。

先求总方案数:

\[(\sum_{i=1}^{v}((v-i+1)^k-(v-i)^k)i^{n-k})^m \]

插值求出关于 \(v\) 的系数,复杂度 \(\mathcal O(n^2)\)

然后考虑要删掉的部分,容斥枚举前 \(k\) 个、后 \(n-k\) 个等于的个数,有:

\[\sum_{i=1}^{k}\sum_{j=1}^{n-k}(-1)^{i+j}\binom{k}{i}\binom{n-k}{j}(\sum_{z=1}^{v}z^{k-i}(v-z+1)^{n-k-j})^m \]

然后问题变成对 \(\mathcal O(n^2)\)\((i,j)\)\(\sum_{z=1}^{v}z^i(v-z+1)^j\)

设二元 EGF

\[F=\sum_{i,j}\frac{\sum_{z=1}^{v}z^i(v-z+1)^j}{i!j!}x^iy^j \]

分别对两维求导,有:

\[F_1=\sum_{i,j}\frac{\sum_{z=1}^{v}z^{i+1}(v-z+1)^j}{i!j!}x^iy^j\\ F_2=\sum_{i,j}\frac{\sum_{z=1}^{v}z^{i}(v-z+1)^{j+1}}{i!j!}x^iy^j\\ \]

发现 \((v+1)F=F_1+F_2\)

于是有:

\[(v+1)f_{i,j} = (i+1)f_{i+1,j}+(j+1)f_{i,j+1} \]


P13833 【MX-X18-T5】「FAOI-R6」纯蓝

定义一个序列的价值为选择两个位置不同的元素得到的最小异或和。

求所有长度为 \(n\)\(a_i\in [0,l_i]\) 的序列的价值和。

\(n,l_i\le 8000\)


差分掉,求 \(f(a)>k\)\(a\) 个数。

\(c_i=\sum_{j=1}^{n}[l_j\ge i]\),则从大到小排序后的序列 \(b\),对应的 \(a\) 个数为 \(\prod_{i=1}^{n}(c_{b_i}-i+1)\)

结论:\(f(a)\le \frac{2\max a_i}{n-1}\)

证明:

考虑 \(f(a)\ge 2^k\) 的条件为 \(\lfloor\frac{a_i}{2^k}\rfloor\) 两两不同,所以 \(\max a_i\ge (n-1)2^k\to 2^k\le \frac{\max a_i}{n-1}\to f(a)\le \frac{2\max a_i}{n-1}\)

\(f_{i,j}\) 表示 \(b_i=j\) 时,上面式子的和,则转移为 \(f_{i,j}\leftarrow (c_j-i+1)\sum_{x=j}^{V}[j\oplus x>k]f_{i-1,x}\)

现在单次 dp 的复杂度为 \(\mathcal O(nV^2)\),而枚举 \(k\) 的复杂度为 \(\mathcal O(\frac{V}{n})\)

考虑优化。

枚举 \(j\oplus x\)\(k\) 的最高不同位 \(h\),则 \(k\) 这位为 \(0\),枚举 \(j\) 高位值 \(j'\),则 \(x'=(k'+1)\oplus j'\),然后 \(j,x\) 的后 \(h\) 位是任意的,所以对于 \(j\in [j'2^h,(j'+1)2^h)\),加上 \(\sum_{x=x'2^h}^{(x'+1)2^h-1}f_{i-1,x}\) 即可。

而对于 \(j\ge x\) 的情况,你发现 \(x'\ne j'\),所以跳过 \(j'>x'\) 的情况即可。

单次转移复杂度 \(\mathcal O(\sum_{i\ge 0} 2^i)=\mathcal O(V)\),总复杂度 \(\mathcal O(V^2)\)


CF1672I

有一个排列 \(p\),多次执行以下操作:

  • 选择 \(i\),满足 \(|i-p_i|\le s\)
  • 对于所有 \(p_j>p_i\)\(j\),令 \(p_j\leftarrow p_j-1\)
  • 删除第 \(i\) 个元素,后面的数移到前面。

求出使得 \(p\) 可空的最小 \(s\)

\(n\le 2\times 10^5\)


先画一个二分图出来,发现 \(|i-p_i|\) 只会减小,且修改是形如两个矩形减一。

所以最优解一定是每次取最小的,且按照 \(i<p_i,i>p_i\) 分类的话。

每次修改一定是大的变小,小的不变。

在几何上,以下面为例,若一个点左上角有点,那么这个点一定不是最小值,所以关键点形如后缀最大值。

并且我们可以不维护坐标,只维护关键点 \(|i-p_i|\) 的值,删掉一个关键点后,只需要在原来的图上继续找后缀最大值即可。

每次只维护关键点的值,那么两维是单调的,所以修改的一定是区间,然后每次删掉一个关键点后,可以均摊找出新出来的关键点,而关键点此时的权值可以由前面删掉的点得出。

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

查商品

\(n\) 个物品排成环,物品有权值 \(a_i\)(排列),顺时针 \(1\to n\),初始有空序列 \(A\),你站在 \(1\)

重复执行以下过程直到所有物品被取完:

  • \(p\) 的概率取走当前位置的物品 \(a_i\) 加入 \(A\)
  • 顺时针移到下一个未取走的物品的位置。

求最后 \(A\) 的字典序排名的期望。

\(n\le 5000\)


考虑排列的权值为前面比你小的数乘上一个阶乘的和。

将过程分成两部分,从 \(1\) 第一次到 \(i\) 与从 \(i\) 开始不断绕圈最后到 \(i\) 选上。

\(g_{i,j}\) 表示第一部分,走到 \(i\) 选了 \(j\) 个。

\(f_{i}\) 表示从 \(x\) 开始绕圈,当前在 \(x\) 还没开始过程,选了 \(i\) 个,转移枚举下一圈选了几个。

注意到转移成环,移项除过去可以解决。

然后你发现钦定一个 \(<p_i\) 的数在 \(i\) 前面选只与这个数在 \(i\) 前还是后有关。

于是对这些 dp 后面加一维 \(0/1\) 表示当前是否选到了钦定点即可。

\(f_i\) 的最终值依赖第一部分带来的初始个数,这是好解决的,你将转移反过来做就行了。

时间复杂度 \(\mathcal O(n^2)\)


CF1842G Tenzing and Random Operations

给出 \(v\) 和长度为 \(n\) 的序列 \(a\),进行 \(m\) 次操作:

每次操作等概率选择 \(i\)\(\forall j\in[i,n]\),令 \(a_j\leftarrow a_j+v\)

\(\prod a_i\) 的期望。

\(n\le 5000,1\le m,v\le 10^9\)


竟有点卡住了,重温一下。

所求就是:

\[\frac{1}{n^m}\prod_{i}(a_i+\sum_{j=1}^{m}[p_j\le i]v) \]

考虑若干项选了 \(a_i\),对于每个 \(j\),也有若干项选了 \(p_j\),系数是 \(\prod_k v[p_j\le i_k]\),要求就是 \(p_j\le i_1\)

\(f_{i,k}\) 表示当前出现了 \(k\) 个不同的 \(j\) 下系数的和,转移考虑 \(i\) 选择了 \(a_i\),还有第一次出现的某个 \(j\),还是之前出现过的。

P6383 『MdOI R2』Resurrection

一棵以 \(n\) 为根的大根树。

按照如下步骤生成一个无向图 \(G\)

选择一个 \(1\sim n-1\) 的排列 \(p\),进行第 \(i\) 次操作,删除树中编号为 \(p_i\) 的边 \((a,b)\),记 \(u,v\) 分别为树中与 \(a,b\) 联通的最大编号点,在 \(G\) 的连边 \((u,v)\)

求有多少种本质不同的 \(G\)

\(n\le 3\times 10^3\)


\(G\) 是一棵树。

\(G\) 合法的充要条件是一条祖先后代链上的返祖边不相错。

\(f_{i, j}\) 表示当 \(i\) 存在 \(j\) 个可选的祖先时,\(i\) 子树的答案。

\[f_{i,j}\leftarrow \sum_{k=1}^{j}\prod_{v} f_{v, j-k+2} \]

时间复杂度 \(\mathcal O(n^2)\)


P8329 [ZJOI2022] 树

分别生成一棵以 \(1\) 为根的小根树和一棵以 \(n\) 为根的大根树。

要求对于任意 \(i\in [1,n]\),他恰好在一棵树中作为叶子。

对所有 \(n\in [2,N]\) 输出方案数。

\(n\le 500\)


恰好??咋开始没看到?

还不会容斥做法。

考虑钦定一种转移方向,从小到大,在 \(T_1\) 上就是加叶子,在 \(T_2\) 上就是合并子树。

\(f_{i,j,k,p}\) 表示 \(j\) 个点钦定为叶子,\(k\) 个点不是叶子但是现在是叶子,\(p\) 个联通块。

  • \(i\) 点在 \(T_1\) 上是叶子:
    • 去满足条件,\(\times k\times \binom{p}{p’}\to f_{i,j+1,k-1,p-p'+1}\)
    • 不去满足条件,\(\times (i-1-j-k)\times \binom{p}{p'}\to f_{i,j+1,k,p-p'+1}\)
  • \(i\) 点在 \(T_2\) 上是叶子:
    • 去满足条件,\(\times k\to f_{i,j,k-1+1,p+1}\)
    • 不去满足条件,\(\times (i-1-j-k)\to f_{i,j,k+1,p+1}\)

现在时间复杂度 \(\mathcal O(n^5)\)

要优化到 \(\mathcal O(n^3)\)

考虑先对 \(T_1\) 上不是叶子的进行容斥,钦定 \(z\) 个之后一直没连边,贡献到 \(j\) 的状态上,最后贡献系数为 \((-1)^z\)

\(f_{i,j,p}\) 表示 \(j\) 个点钦定为叶子,\(p\) 个联通块。

  • \(i\) 点在 \(T_1\) 上是叶子:
    • \(\times (i-1-j)\times \binom{p}{p'}\to f_{i,j+1,p-p'+1}\)
  • \(i\) 点在 \(T_2\) 上是叶子:
    • 钦定之后一直没连边,\(\times (-1)\times (i-1-j)\to f_{i,j+1,p+1}\)
    • 之后任意,\(\times (i-1-j)\to f_{i,j,p+1}\)

现在复杂度瓶颈在于组合数部分,其本质在于选择若干点作为儿子。

但是我可以在加入联通块时就区分等价类,一个等价类内的联通块最终合并到一起。

就做完了。


P9528 [JOISC 2022] 蚂蚁与方糖

一个坐标为 \([0,10^9]\) 的数轴。

进行 \(q\) 次操作:

  • 操作一:在 \(x_i\)\(a_i\) 个人。
  • 操作二:在 \(x_i\)\(a_i\) 个糖。

每次操作后模拟,将人连向距离他 \(\le L\) 的糖,求二分图最大匹配。

\(q\le 5e5,1\le L\le 10^9\)


考虑一个 hall 定理,开始我可以先将下面那个轴向右移动 \(L\),变成每个点向右 \(2L\)

hall 定理说明的是,下面的东西选择不相交的若干区间,对应找上面被包含的点,但是下面的相交肯定不优,所以我只需考虑让上面的点不交就行了。

然后我考虑让一个部分下面多出来的 \(2L\) 的部分放到上面最右边那个点上,钦定上面 \(1\to 0\) 之后那个 \(0\) 有如此贡献。

这样左部点修改可以线段树维护。

对于右部点修改,发现修改区间为 \(2L\),这样长度的区间内最多一个结束点,故可以快速更新,下方也行。


P13755 【MX-X17-T4】Yet another Game problem

一个长度为 \(n\) 序列 \(a\),初始 \([l,r]=[1,n]\)

\(A\)\(B\) 轮流操作:

  • \(A\) 可以选择 \(i\in (l,r]\),将区间变为 \([i,r]\)
  • \(B\) 可以选择 \(i\in [l,i)\),将区间变为 \([l,i]\)

\(l=r\) 时结束,得分为 \(a_l\)

\(A\) 要得分最大,\(B\) 最小,求最终得分。


考虑二分答案 \(lim\),将 \(\ge lim\) 的设为 \(1\)\(< lim\) 的设为 \(-1\)

则先手操作必然不会让左端点为 \(-1\),后手操作必然不会让右端点为 \(1\)

???

考虑先手移动完后 \(l\) 所在的 \(1\) 段个数必须比下一段的 \(-1\) 个数多,否则后手下一段右端点他就炸了。

结论:必胜当且仅当存在非空真后缀和 \(\ge 0\),且先手选择的点为后缀最大值。

充分性,先手走到任意一个严格后缀最大值的位置 \(p\),若 \(p=n\) 则胜利;否则假设后缀操作至 \(p'\),都一定有 \([p,p']\) 的和 \(>0\),这样始终存在一个非空真后缀和 \(\ge 0\),如此往复,最后 \(p'=p\),且和 \(>0\),故胜利。

必要性,反证,假设原序列不存在非空真后缀和 \(\ge 0\),说明唯一的严格后缀最大值为 \(n\)

如果左端点移动到 \(n\),先手败。

否则不移动到严格后缀最大值上,假设移到了 \(p\),设 \(suf_{p+1}\sim suf_n\) 中的第一个 \(-1\) 位置为 \(p'\),后缀移动到 \(p'-1\),依然不存在非空真后缀 \(\ge 0\),先手必败。


P10547 [THUPC 2024 决赛] 排列游戏

问多少排列满足:

  • 恰好 \(n\) 次交换不同位置两个数可以进行排列。
  • 定义交换 \(i,j\) 的代价为 \(|i-j|\),可以使用 \(\le m\) 的代价进行排列。

\(n\le 500, m\le 5000\)


妙妙啊!

条件一等价于置换环数量为偶数。

条件二等价于 \(\sum |i-p_i|\le 2m\)

考虑 \(\sum |i-p_i|=2\sum [i\le p_i] p_i-i\)

\(f_{i,j,k,p=0/1}\) 表示当前置换环奇偶性为 \(0/1\),插入了 \([1,i]\) 的数,形成了 \(j\) 条链,总和为 \(k\)

  • 钦定为链首,\(\to f_{i,j+1,k-i,p}\)
  • 钦定单独成环,\(\to f_{i,j,k,p\oplus 1}\)
  • 连接前面的段,后面还得接上上升的,\(\times j \to f_{i,j,k,p}\)
  • 连接前面的段,后面接上已经出现过的段尾,下降了,\(\times j\times (j-1)\to f_{i,j-1,k+i,p}\)
  • 将前面一条链连成环,\(\times j\to f_{i,j-1,k+i,p\oplus 1}\)
  • 接在段的前面,\(\times j\to f_{i,j,k,p}\)

问题是现在 \(k\) 的取值达到了 \([-n^2,n^2]\)

但是我们可以在 \(i\to i+1\) 时,令 \(k\leftarrow k+j\),因为 \(j\) 的定义是后面还会接上的段数。

这样 \(k\)\(\mathcal O(m)\) 的。

可以发现 \(j\)\(\mathcal O(\sqrt m)\) 的。

时间复杂度 \(\mathcal O(nm\sqrt m)\)


P9385 [THUPC 2023 决赛] 阴阳阵法

基环树上有 \(n\) 个白点,\(m\) 个黑点,共 \((n+m)^{n+m}\) 个方案。

计算满足以下条件的方案数:

  • 黑点指向白点。
  • 每个环上黑点和白点数量乘积为偶数。

\(n,m\le 2000\)


考虑一个基环树的遍历过程,每次从小往大找到第一个未遍历的点,从它开始沿着出边遍历下去直到访问到已经遍历过的点。

遍历路径有链,\(\varphi\) 型,而这些都是不交的!!!!

分阶段 dp

\(f_{i,j}\) 表示加入了 \(i\) 个白点,\(j\) 个黑点,进行完若干轮扩展后的方案数。

\(g_{i,j,0/1,0/1}\) 表示当前遍历了 \(i\) 个白点,\(j\) 个黑点,正在进行扩展一,当前在白或黑点,钦定终止节点的颜色为白或黑(因为需要满足条件一)。

\(h_{i,j,0/1,0/1/2,0/1,0/1}\) 表示当前遍历了 \(i\) 个白点,\(j\) 个黑点,正在进行扩展二,当前在白或黑点,已经钦定了环的终止节点颜色为白或黑或者未钦定终止节点,环上白点奇偶性,环上黑点奇偶性。

只有当加入了 \(n\) 个白点后,开始节点才能是黑点。


P11292 【MX-S6-T4】「KDOI-11」彩灯晚会

给出一个联通的 dag,每个点的颜色可以是 \([1,k]\)

给出一个 \(l\),定义一种方案的价值为每种颜色的长度为 \(l\) 的链(即 \(l\) 个点)的数量平方之和。

求所有方案价值之和。

\(n\le 300, k<998244353, l\le 20\)


首先有一个记录当前两个人走到哪里,分别走的长度,然后让拓扑序小的人一直走的做法。

考虑容斥,\(k^t=\sum_{j=0}^{t}\binom{t}{j}(k-1)^j\),即每个钦定交长度为 \(j\) 的走路方案贡献为 \((k-1)^j\)

那么记录当前交在哪个点,枚举下一个交点,分步将两个人走过去即可做到 \(\mathcal O(n^2L^3+n^3L)\)


P11696 [JRKSJ ExR] 七影蝶

长度为 \(n\) 的非负整数序列 \(a_{1\sim n}\)

接下来有 \(q\) 次询问,每次询问给出非负整数 \(L,R\),求

\[\max_{x=L}^R\left(\sum_{i=1}^n\mathrm{popcount}(a_i+x)\right) \]

\(1\le n,q\le 5\times 10^5\)\(0\le L\le R\le 10^{11}\)\(0\le a_i\le 10^{11}\)


钦定 \(a_i+x\) 的第 \(k\) 位为 \(1\) 的条件为 \((a_i+x)\bmod 2^k\ge 2^{k-1}\)

可以求出 \(x\bmod 2^k\) 的两个区间 \([2^{k-1}-a_i, 2^k-a_i),[2^k+2^{k-1}-a_i, 2^k)\)

则对每个 \(a_i\),求出 \(\mathcal O(\log V)\) 个区间,形如 \(x\bmod 2^k\in [l,r]\),则答案加一。

考虑一个主席树,对 \(k\) 从小往大处理,做完 \(k\) 的修改之后,将当前版本复制一遍作为右子树就能完成对 \(k+1\) 层的前置处理,时空复杂度均为 \(\mathcal O(n\log^2V)\)

考虑询问时如果得到了 \(k+1\) 层及以上所有修改对这次询问的所有贡献,那么第 \(k\) 层及以后的贡献就和上面的修改无关了。

类似线段树结构,询问区间在一个节点分裂开后,每一层最多两个节点,则上面的“贡献”可以视作 LCA 处的答案与每层两个节点之前的标记和。

考虑优化。

注意到:

  • \(k\) 位一类区间为 \([l,r)\),则后 \(k+1\) 位为 \([0, r)\)\([l+2^{k-1},r+2^k)\),且有 \(r=l+2^{k-1}\)

  • \(k\) 位二类区间为 \([l,2^k)\),则后 \(k+1\) 位为 \([2^{k-1}+l,2^{k+1})\),且有 \(r_1+2^k=2^k-a_i+2^k=2^k+2^{k-1}+2^{k-1}-a_i\)

\(k\) 级区间的端点,分别 \(+0、+2^k\) 后得到的端点为 \(k+1\) 级区间的超集。(1)

上面的东西说明了什么?我们可以考虑模拟线段树结构,每层分成若干区间,满足下层区间是当前层区间的分裂!

并且根据复制的过程,第 \(k+1\) 层的值域为 \([0,2^{k+1})\),一个数 \(x\in [2^k,2^{k+1})\),往下跳刚好跳到下一层的 \(x-2^k\) 处,所以这些端点也能满足往下处理的条件!

故我对每层的修改维护若干等价类,即对端点去重后取相邻为一段,一共 \(\mathcal O(n)\) 个。

则当前第 \(k\) 层的修改对询问区间的贡献是能处理的,前提是预处理出了,在考虑\(k\) 层及以后的修改后,每个等价类的 \(\max\)

还有一个好处是,可以简单处理出每层对端点的离散化:过程是每个端点每次头顶加一位,类似后缀排序做,具体来说,将 \(-a_i\) 排序,然后将 \(2^{k-1}-a_i,2^k-a_i,2^k+2^{k-1}-a_i\) 归并起来即可。

现在能做到预处理 \(\mathcal O(n\log V)\),询问 \(\mathcal O(q\log V)\),每次查当前层的等价类区间 \(\max\)(维护一个线性 rmq),剩下的散块吸收标记后放到下一层处理。

考虑优化,将询问端点的后 \(k\) 位插入每一层的端点中,恰好能满足条件 (1)!

那么每次询问直接在最上面一层做 rmq 就能直接回答!

时间复杂度为 \(\mathcal O((n+q)\log V+q)\),空间对数,也可以换成线段树。


P12264 『STA - R9』咏叹调调律

一段旋律是一个仅含 \(\tt ABC\) 的字符串 \(S\)。一段旋律被称作咏叹调当且仅当可以通过每次删除一个 \(\tt AB\) 子序列、\(\tt CA\) 子序列、\(\tt AAA\) 子序列或 \(\tt CCB\) 子序列来得到空串。

对于非负整数 \(p,q,r\),一段含 \(a\)\(\tt A\)\(b\)\(\tt B\)\(c\)\(\tt C\) 的旋律的音韵被定义为 \(p^aq^br^c\)(其中 \(0^0=1\))。

给定正整数 \(n,p,q,r\),对于每个 \(1\le k\le n\),问长度为 \(k\) 的咏叹调的音韵之和。答案可能很大,对 \(998244353\) 取模。

\(1\le n\le 500\)\(0\le p,q,r<M\)


有点神秘了这题。

一个前缀的 \(A\) 匹配 \(AB\),一个后缀的 \(A\) 匹配 \(CA\)

考虑将 \(A\) 划分成 \(A_L,A_R\)

观察:将 \(A_L,C,A_R,B\) 分别看成两个 \((\),一个 \((\),一个 \()\),两个 \()\),则合法串必要条件为合法括号串。

但是还有要求是,双括号的不能拆开分别匹配。

并且我们还能得到,只存在一种合法划分。

所以钦定优先级,\(A_LB>A_LA_RA_R/CCB>CA_R\)

接下来考虑 dp,记录存在多少什么类型的左括号。

当插入 \(A_R\) 时,我们考虑优先匹配 \(A_LA_R\),但是后面可能这个 \(A_L\) 会与 \(B\) 匹配,若 \(A_R\) 可与前面的一个 \(C\) 匹配,则先删去这个 \(C\),预留一次反悔机会。

当插入 \(B\) 时,优先匹配 \(A_LB\),否则若存在可反悔的 \(A_LA_R\) 就反悔,最后不行再和 \(CC\) 匹配。

若已经存在匹配的 \(A_LA_R\) 时再出现一个 \(A_R\),直接匹配 \(A_LA_RA_R\) 即可,否则若匹配 \(A_LB\) 合法的话,前面一定存在 \(CC\),匹配 \(CCB\) 即可。


CF1710E Two Arrays

给定两个长度 \(n\) 序列 \(a,b\)

Alice 和 Bob 在一个 \(n \times m\) 的网格上进行游戏。初始时,棋盘上的车位于第一行第一列。

每次轮到某位玩家时,可以进行以下两种操作之一:

  1. 将车移动到当前行或当前列的另一个格子。玩家不能将车移动到已经被访问过 \(1\) 次的格子。
  2. 立即结束游戏,得分为 \(a_r+b_c\)

Bob 希望最大化得分,而 Alice 希望最小化得分。如果两人都采取最优策略,游戏的最终得分是多少?

\(n,m\le 2\times 10^5\)


二分图博弈:给定二分图和起始点,每个点只能走到一次,每个人只能走到相邻的点,无法操作的人输。

先手必胜的条件是最大匹配一定包含起始点

若最大匹配包含起始点,则先手按照匹配走,若后手走到非匹配点,则存在一条增广路使得匹配数不变,但是匹配不包含 \(H\),矛盾。

若最大匹配不一定包含起始点,考虑某个不含 \(H\) 的最大匹配,那么先手初始走点一定是匹配点,然后后手一定按照匹配选点即可,那么先手不可能选到非匹配点,否则匹配数变多,矛盾。

所以本题二分答案后变成求二分图的最大匹配,转成最大独立集。

那么问题相当于每行每列选一个颜色,一个点只能在都符合行列颜色时才能选。

根据调整,行列都是一个前缀选 \(0\),一个后缀选 \(1\)

且对于每一行来说,钦定 \([1,i]\)\(0\),则最优的列分界点是单调的。

于是就做完了。

P13826 [Ynoi Easy Round 2026] 寒蝉鸣泣之时

给定 \(n\) 个边平行于坐标轴的平面矩形,以及正整数 \(m\),对 \(1\le m\cdot i\le n\) 的每个整数 \(i\) ,你需要计算出恰好被 \(m\cdot i\) 个矩形包含的区域的面积。

\(i\) 个矩形用四个整数表示为 \(x_{1,i},x_{2,i},y_{1,i},y_{2,i}\)

恰好被 \(i\) 个矩形包含的区域的面积即为有多少个整点 \((x,y)\) 满足 \(\sum\limits_{j=1}^n[x_{1,j}\le x<x_{2,j}][y_{1,j}\le y<y_{2,j}]=i\)

\(n\le m^2\le n^2\)\(1\le x_{1,i}<x_{2,i}\le n\)\(1\le y_{1,i}<y_{2,i}\le n\)\(1\le n\le 3\times 10^5\)


考虑一个块被修改了 \(+m,-m\) 就重构。

重构时处理块内的数在执行了 \([-m,+m]\) 的加法后,每一个答案的变化量,就能在 \(+1\) 时,快速知道答案变化量。

由于每一块的答案是独立的,所以分别对每一块做空间就是线性的。

P13827 [Ynoi Easy Round 2026] 寒蝉鸣泣之时·业

D2T2


P12152 【MX-X11-T6】「蓬莱人形 Round 1」催眠术

给定 \(n,m,k\),还有一个长为 \(m\) 的值域在 \([1,k]\) 中的整数序列 \(a\),再给定一个大小为 \(n \times (m+1)\) 的矩阵 \(c\)

定义一个整数序列是好的,当且仅当它的值域在 \([1,k]\) 中且所有值域在 \([1,k]\) 的长为 \(m\) 的整数序列都是它的子序列。

定义一个好的整数序列 \(b\) 的价值为 \(\prod\limits_{i=1}^n c_{i,pre_i}\),其中 \(pre_i\)\(a\) 的最长前缀长度使得 \(a_{1 \sim pre_i}\)\(b_{1\sim i}\) 的一个子序列,若不存在则 \(pre_i = 0\)

求所有长度为 \(n\) 的好序列的价值和,答案对 \(10^9+7\) 取模。

\(1 \le n,m,k \le 400\)\(1\le a_i\le k\)\(1 \le c_{i,j} < 10^9+7\)


填了 \(i\) 个数,处于第 \(j\) 段,\(pre_i = x\), \(pre\) 中颜色数 \(p\),其外颜色数 \(q\)

  • 下一个数匹配。

    • \(pre_{i+1}\) 在前面出现过,\(p,q\to p,q\)
    • 不在前面 \(q\) 种中 \(p,q\to p+1,q\)
    • 在前面 \(q\) 种中选一种,\((p,q)\times q\to (p+1,q)\)
  • 下一个数不匹配,有要求是相邻两个匹配点 \(a,b\) 之间的 \((a,b)\) 不能出现 \(pre_{i+1}\) 这个数,那么在上一个匹配点处钦定下一个匹配点为上面第三种转移时,先删掉一种颜色。

    • 若这个数是新数,\((p,q)\to (p,q+1)\)

    • 否则在 \(p\) 中出现,\(pre_{i+1}\) 若在前面出现了就少一种。

    • 否则在 \(q\) 中出现,\((p,q)\times q\to (p,q)\)

而在跑一个段的最后一个匹配点之后,若 \(pre_{i+1}\) 不在 \(p\) 中,则要求后面的数不能选 \(pre_{i+1}\),发现 \(pre_{i+1}\) 一定在 \(q\) 中,所以类似将 \(q\) 中直接选择一个等价类钦定为 \(pre_{i+1}\),然后删掉,最后再加上即可。

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


NOI2025 集合 另一种方向的容斥


CF2119E


CF2109F


CF2109G


AT_xmascon20_f Famous in Russia

对于给定的长为 \(n\) 的正整数序列 \(a_{1\sim n},b_{1\sim n}\),定义 \(f(a_{1\sim n},b_{1\sim n},k)\) 为选择 \(k\) 个互不相同的 \([1,n]\) 下标 \(p_{1\sim k}\),下式的最小值:

\[\max_{i=1}^k\left(b_{p_i}+\sum_{j=1}^ia_{p_j}\right) \]

给定 \(n,v\) 以及正整数序列 \(b_{1\sim n}\),对于 \(1\le k\le n\) 分别求出:对于所有值域为 \([1,v]\) 的正整数序列 \(a_{1\sim n}\)\(f(a_{1\sim n},b_{1\sim n},k)\) 之和对 \(998244353\) 取模的结果。

\(n\le 30\)\(v\le 20\)\(1\le b_i\le n\cdot v\)


按照 \(b_i\) 从小到大排序。

遍历 \(1\to n\)

  • \(s\) 与堆顶元素和 \(\le b_i\),将 \(s\) 加上堆顶被弹出,重复执行。
  • 将堆顶元素减去 \(b_i-s\),令 \(s\leftarrow b_i\)
  • 插入 \(a_i\)

\(f_{i,k,l,r,s}\) 表示插入了 \(a_{1\sim i-1}\),钦定 \(k\) 个元素被完全弹出,当前堆内还存在的最大钦定被弹出数,当前堆内最小的钦定不被弹出数,当前答案为 \(s\)

  • \(s\le b_i\),则所有钦定被弹出数全被弹出,而钦定不被弹出的最小元素会减小 \(b_i-s\),故 \(l'\leftarrow 0,r'\leftarrow r-(b_i-s),s'\leftarrow b_i\)
  • 否则存在至少一个前面被钦定需要弹出的数未被弹出:
    • \(\ge 2\) 个,则有 \(l+b_i\le s\)\(l\) 不变。
    • 否则 \(l'\leftarrow s-b_i\)
    • 综上,\(l'\leftarrow \min(l,s-b_i),r'\leftarrow r, s'\leftarrow s\)

P12020 CF1033F 加强版

给定若干种二进制的运算符,给定 \(n\)\([0,2^w)\) 的数 \(a_i\),每次询问钦定每一位采用哪种运算符,计算有序数对 \((x,y)\) 满足 \(a_x\) 运算 \(a_y\) 等于 \(z\)

\(w\le 16,n\le 10^5,q\le 10^5\)


考虑 \(10\)\(01\) 的结果相同,则可以按照 \(i+j \bmod 3\) 的结果分成三类。

每种运算符可以看成钦定某一位 \(i+j\bmod 3\) 的结果为定值或者在两者之一。

当“两者之一”的类较少时,\(2^b\) 枚举统计表中,表可以使用分治版 fwt \(\mathcal O(3^n)\) 预处理。

否则,我们希望将“定值”类转化成“两者之一”类,这是可以做到的:\(\{0\}=\frac{\{0,1\}+\{0,2\}-\{1,2\}}{2}\),这个表也可以 \(\mathcal O(n3^n)\) 预处理。

故复杂度为 \(\mathcal O(n3^n+q\min(2^b,3^{d-b}))\)


QOJ8557

???


吃豆(pacman)

\(n\) 个吃豆人,和 \(m\) 个豆豆,每个豆有颜色 \(\in [1,n]\),编号为 \(i\) 的吃豆人只能吃颜色为 \(i\) 的豆豆。

将这 \(m\) 个豆豆一个一个扔给吃豆人。

如果一个吃豆人吃了至少 \(a_i\) 个豆豆,那么它就会立刻爆炸。如果某个吃豆人爆炸了就不会扔豆豆了。

事先确定好扔豆豆的顺序,每个吃豆人想知道:它会爆炸的顺序有多少种。

\(n\le m\le 2\times 10^5\)\(a_x\le \sum_{i=1}^{m}[col_i=x]\)


考虑枚举结束颜色,与位置。

方案数可以用 GF 表示,类似 \((G\times \prod F_i)\cdot H\)

发现移位后就是 \(G\cdot (H / \prod F_i)\),中间是差卷积,且 \(G\) 只有一项非 \(0\)

考虑分治维护 \(H / \prod F_i\),发现每次递归进子区间的项数大约为 \(\sum a_i\),故带权分治即可。


排列(perm)

考虑同时取到最小值。

那么每次就要求在同一环上取两个数将环分裂开,这两个数有大小关系的条件,钦定其中一个为最小值,并维护其位置,分别向左向右找到第一个合法操作点,一找到就操作,这就是启发式分裂的过程。

specie

\(n\) 个物种,每个物种有 \(c_i\) 个人,且不适宜在一个矩形生存。

对于一种生存情况,定义权值为每个格子 \(\binom{num}{2}\) 的和,最大化权值。

\(X,Y\le 1000\)\(n\le 10^6\)


对于一种方案,一个人要是能到更大的就调整过去,方案可以表示为按照权值从大到小,每次将一个点周围的人全部吸过来。

若第一个位置为 \((x,y)\),第二个位置为 \((x',y')\),假设 \((x',y')\)\((x,y)\) 左上方,那么将 \((x',y')\) 调整成 \((1,1)\) 不劣,那么若存在第三个数,最优就是取对角了。

简单计算即可。


string

\(n\) 个长度为 \(m\) 且初始全为 \(0\) 的串,每次操作将区间串的第 \(x\) 个位置写成 \(w\),保证每个位置被写至多一次。

求最后字符串排序顺序。

\(n,m\le 2\times 10^5\)


可以从左往右扫,主席树维护。

直接排序,比较就在主席树上做,\(\mathcal O(n\log^2n)\)

考虑类似后缀排序,每次翻倍,那么我可以将值域调成 \(2^k\),对主席树上 \(\mathcal O(n\log n)\) 个节点,在每一层上进行排序,这样在最上层就能知道每个数的排名了。

太厉害了,做到 \(\mathcal O(n\log n)\)


P10675 【MX-S1-T4】先见之明

给定 \(n\) 个非负整数 \(a_1, a_2, \ldots, a_n\)。有 \(q\) 次询问,每次询问:

  • 给定一个非负整数 \(k\),你需要从 \(2^{a_1}, \ldots, 2^{a_n}\) 中取出一个子集,使得它们的和 \(\ge k\)
  • 在保证和 \(\ge k\) 的前提下,最小化它们的和。
  • \(k\) 以二进制的形式给出。

\(1\le n,q\le 10^6\)\(0\le m\le 10^6\)\(\sum m\le 5\times 10^6\)\(0\le a_i,p_i\le 10^6\)\(p_i>p_{i+1}\)


考虑若存在 \(j\) 满足 \(\sum_{i=j}^{m}2^{p_i}> \sum_{a_y\le p_j}2^{a_y}\),则必须得存在一个 \(>p_j\) 的位置取 \(1\)\(k\) 那位取 \(0\) 才行,故找到最小的 \(j\)\(p_j\) 之后都填 \(0\)

先证明若不存在 \(j\),则答案 \(=k\)

考虑从 \(p_m\) 开始构造,那么后面一定能凑出 \(p_m\),且前面的式子的大小关系不变。

若存在 \(j\),那么对于最小的 \(j\),有:

\[\sum_{i=j}^{m}2^{p_i}>\sum_{a_y\le p_j} 2^{a_y}\\ \sum_{i=j}^{m}2^{p_i}+2^{p_{j-1}}\le \sum_{a_y\le p_{j-1}} 2^{a_y} \]

所以有:

\[\sum_{p_j<a_y\le p_{j-1}}2^{a_y}>2^{p_{j-1}} \]

即用 \((p_j,p_{j-1}]\) 的数可以将 \(2^{p_{j-1}}\) 凑出,且会多出东西,可以构造出多出最小的一位 \(a_u\),那么有:

\[\sum_{i=j-1}^{m}2^{p_i}\le \sum_{a_y\le p_{j-1}} 2^{a_y}-2^{a_u} \]

同理可推出对 \(k\in [1,j-1]\) 的式子都是 \(\le\) 的,故前缀可构造。

现在问题在于比较 \(\sum_{i=j}^{m}2^{p_i}\)\(\sum_{a_y\le p_j}2^{a_y}\) 的大小。

先求出 \(a_i\) 总和的二进制表示 \(S\)

对于所有 \(v\),求出 \(\sum_{a_y\le v}2^{a_y}\) 的二进制最高位,记为 \(mx_v\)

\(mx_{p_j}>p_j\),则 \(j\) 的式子为 \(\le\),而我们只需找最小的 \(>\)\(j\)

否则等价于 \(S\)\([p_j,0]\) 后缀与 \(p\)\([j,m]\) 后缀比较大小,可以预处理递推得出。

不会求这个分界点在哪也可以,对每一段的 \(2\) 个可取额外点维护条件,共 \(2m\) 个点需要判断,预处理一些东西就能做到。


若一个 \(a_i\) 出现 \(\ge 3\) 次,那么将两个合成一个答案不变。

则设 \(s_i=\sum_{j=0}^{i}c_j 2^i\),那么 \(s_i<2^{i+2}\)

考虑从高到低消去 \(k\) 的每一位 \(h\),若 \(s_h<k\),则答案为 \(>h\) 的最小 \(a_i\)

  • \(c_h>0\) 可以消去。
  • \(c_h=0,c_{h-1}=0\),由于 \(s_{h-2}<2^h\),无解。
  • \(c_h=0,c_{h-1}>1\),可以凑出,结束。
  • \(c_h=0,c_{h-1}=1\),需要往下跑递归。

若直到 \(k\) 的次高位 \(h'\) 都未消去时,\(c_{h'},c_{h'+1}\) 都被使用,则后面还需 \(2\times 2^{h'}=2^{h'+1}>s_{h'-1}\),无解,结束。

将连续的 \(1\) 缩起来,直接模拟,使用线段维护比较当前 \(s_h\)\(k\) 的大小。

也可以直接向上面那样对 \(2m\) 种情况判断,就不用比较大小了。


Number

给出串 \(s\),问多少 \((A,B)\) 满足:\(A,B\)\(s\) 子串,\(A,B\) 长度相同,\(B=A+1\)

\(|s|\le 4\times 10^5\)


答案形式为 \((xB9999\cdots,x(B+1)0000\cdots)\)

SAM 上枚举 \(\mathcal O(10n)\) 种结尾,枚举长度,枚举 \(x\) 所在等价类,上面两类的东西一定在他的 fail 子树内,建出虚树统计即可。


Sequence

问多少长度为 \(n\),每个数 \(\in[1,m]\) 的序列满足 \(\gcd(k^2,\prod_{i=1}^{n}a_i)=k\)

\(n,m\le 10^{18}\)\(k\le 10^{15}\)


搜索 \(k\) 的递增因子序列,暴力找下一个因数可以过 \(10^9\)

优化考虑在 \(k\) 的因子序列上跳,跳到的下一个位置预处理出来,不知道为啥过了。


TB

\(n\) 个初始为空的可重集合,每次操作往区间集合插入 \(x\),或者查询区间多少集合以 \(x\) 为绝对众数。

\(n\le 2\times 10^5\)


先对每个块分别跑。

考虑维护两种之前为绝对众数的数以及当前的 \(2sz1-sz\) 的值,添加数若出现了绝对众数,若是这两个数之一就对应修改,否则是新的数,就替换,后面情况只会发生 \(\mathcal O(\log n)\) 次。

考虑对每个块维护整块标记序列以及单点标记序列。

对整块的两个关键数维护单点序列上的信息后缀和,当关键数修改时,就重构。

同时再维护单点中为绝对众数的 \(2sz1-sz\) 的后缀和,塞到绝对众数那个颜色上。

则查询时绝对众数一定在整块或单点中为绝对众数,若是前者,查整块信息,否则查单点信息。

时间复杂度 \(\mathcal O(n\sqrt n)\)


字符串(string)

给定母串 \(S\),每次操作加入一个串或者,将 \(pos,len\) 循环添加到末尾,每次操作后求 \(S\) 在当前串的出现次数。

\(|S|\le 2\times 10^5\)\(q\le 10^4\)\(|T|\le 10^{15}\)


首先可以用一个可持久化平衡树维护倍增与拼接。

现在只需要维护信息以支持合并。

考虑维护最长前缀、最长后缀使得其为 \(S\) 的子串。

则拼接即查询一些 fail 树上的信息。

更新即找到一个子串使得其能表示为两个子串的拼接,在后缀数组上二分其位置即可,每次只需求出 LCP,对两个子串模拟即可。

拼接需要离线下来处理。


高速公路(highway)

\(m\) 条链,\(n\) 个点,每个点有 \([1,k]\) 的颜色,链上一步花费 \(1\),相同颜色点的跳跃花费 \(1\),求两两点最短路的和。

\(m\le n\le 10^6,k\le 20\)


先考虑求出每个点到达一种颜色的最短距离。

对每种颜色,将他们作为起点,跑一个 bfs 即可。

朴素建图会有边权为 \(1,2\) 的边,然后使用 deque,但是这样太慢了。

同种颜色的点一碰到一个直接处理一类即可。

\(ans=\min(|x-y|,D_i(x)+D_i(y)+1)\)

注意到右边的东西不超过 \(2D\),因为跳跃的颜色不重,且链上走过的颜色不重。

故可以先全部计算后面的式子,然后对同一链上距离较近的修正。

枚举 \(x\)\(col_y=C\),则所有 \(D_i(y)\) 极差 \(\le 1\),可以将每个 \(y\) 用一个二进制表示。

则找到 \(D_i(x)+Mn_i(y)\) 的最小值所对应的 \(i\) 集合,若 \(y\) 在这些位置上都为一,则 \(ans=mn+1\) 否则 \(ans=mn\),可以高维后缀和预处理。

同理可以对 \(col_x=C_1,col_y=C_2\) 同时处理,分别讨论一下 \(+0,+1,+2\) 即可。


括号串(bracket)

考虑一个括号串反转 \([l,r]\) 合法的条件是:

  • \(\forall i\in [1,l-1], s_i\ge 0\)
  • \(s_r-s_{l-1}=\frac{s_n}{2}\)
  • \(\forall i\in (r,n],s_r\ge s_n\)
  • \(\forall i\in[l, r],2s_{l-1}\ge s_i\)

不会。。。


posted @ 2025-08-18 16:52  蒟蒻orz  阅读(29)  评论(0)    收藏  举报