10 月记录
P14177 【MX-X23-T7】我爱数数
有一个长度为 \(n\) 的正整数序列 \(a_1,\dots,a_n\) 和一个长度为 \(n\) 且初始都为 \(0\) 的整数序列 \(b_1,\dots,b_n\)。
现在有 \(m\) 种操作,每种操作给出 \(l_p,r_p,c_p\),表示如果进行这次操作则会发生如下事件:
- 对于 \(l_p\le i\le r_p\),令 \(b_i\leftarrow\max(b_i,c_p)\)。
每次会独立等概率随机在 \(m\) 种操作中选择一种进行,问期望几次操作后能满足 \(b_i \ge a_i\) 对全体 \(i\)(\(1 \le i \le n\))均成立,求出其对 \(10^9+7\) 取模后的值。如果期望不存在,输出 \(-1\)。
\(1\leq n \leq 80\),\(1\leq m\leq 2000\),\(1 \le a_i, c_p \le n\),\(1 \le l_p \le r_p \le n\)。
一种方案的贡献是每个位置合法时间的 \(\max\),考虑 \(\min-\max\) 容斥。
转化为求一个集合存在点第一次合法的期望时间,那么就是对于区间 \(j\) 满足 \(i\in [l_j,r_j],c_j\ge a_i\),设有 \(k\) 个这样的合法区间,期望次数就是 \(\frac{m}{k}\)。
不妨考虑构建关于 \(a\) 的笛卡尔树,先找出最小值,而跨过的区间若 \(c_j\ge a_i\) 则合法,否则不合法,这样就能转为左右子区间的问题。
故设 \(f_{i,l,r,k}\) 表示当前考虑区间 \([l,r]\) 且强制 \(<i\) 的不能选,子树内共有 \(k\) 个合法区间的方案的系数和。
枚举区间中 \(S\) 的最小值位置 \(p\)(钦定最前的)则所有跨过且 \(\ge a_{p}\) 的区间选上,\(f_{i,l,r,k_1+k_2+w}\leftarrow -f_{a_p+1,l,p-1,k_1}\times f_{a_p,p+1,r,k_2}\)。
此时时间复杂度为 \(\mathcal O(n^3m^2)\),观察到转移为卷积然后平移形式,可以维护点值,最后插值回来,时间复杂度为 \(\mathcal O(n^3m)\)。
P14141 「SFMOI Round II」Strange Mortar Game(Part1)
在一个 \(n\) 行 \(m\) 列的网格上,敌人从 \((1,1)\) 走到 \((n,m)\)。
有 \(k\) 个矩形,可以任意次任意非开始结束时刻进行操作,向矩形内所有点进行定点清除,操作一次有代价为矩形面积。
输出最少的炮弹消耗量并且构造每门炮的开火情况,或者说明无法阻挡敌方部队。
\(n,m,k\le 10^3\)。
显然某个时刻选择一个矩阵的有效阻击范围为一条斜线。
考虑什么样的斜线集合是合法的。

发现等价于从左下角往右上角顺序选斜线,每条斜线左下角点在上一条斜线右上角点的左下角即可拦截住敌人。
然后就随便做了。
P7214 [JOISC 2020] 治療計画
有 \(n\) 个人,初始所有人感染
有 \(m\) 个治疗方案,表示在第 \(T_i\) 天的晚上,\([L_i,R_i]\) 区间内的人被治愈,代价为 \(C_i\)。
每天早上,如果第 \(i\) 个人感染,则 \(i-1\) 和 \(i+1\) 也会感觉。
你需要选择方案,最小化代价,使得所有人被治愈。
\(1 \le n,T_i,C_i \le 10^9\),\(1 \le m \le 10^5\)。
这个题也是类似的,等价于选若干三角形挡住。
这题就是上面那题旋转一下。
那么条件等价与 \(|d_1-d_2|\le r_1-l_2\)。
那么求出最短路就是答案,因为这是点权最短路,故每个点只会松弛一次,进队一次,当这个点的最小入点出队时,就将他入队。
每次从优先队列取出一个点,更新他的所有能更新且未入队的出边,全部加入队列,并更新为入队。
按照 \(d_i\) 排序建线段树,左边右边分别跑,每一边的条件是一样的,递归取出就能取出所有合法点。
时间复杂度 \(\mathcal O(n\log n)\)。
这和 P5471 [NOI2019]弹跳 很像。
P14135 【MX-X22-T6】「TPOI-4F」Miserable EXperience
给出一棵树,每个点带点权。
两种操作:
- 子树 \(-1\)。
- 选择某个深度,将这个深度的点 \(-1\)。
独立地对于每个 \(u\),求最少操作数使得 \(u\) 子树内点恰好为 \(0\)(子树外无限制),或报告无解。
\(n\le 10^6,0\le a_i\le 10^9\)。
显然用操作一合法的要求是 \(d_u\ge d_{fa_u}\)。
考虑从下往上贪心做,先让子树的 \(d\) 全部等于 \(d_u\)。
考虑一层的合并,先求出边上差值最小值,若上面大于下面,就使用操作二。
若下面大于上面,由于这个时候可以整个操作,令 \(f_i=\min (cnt_i,f_{i+1}+1)\),则令下面的层全部 \(-1\) 的最小代价为 \(f_i\)。
最后再额外使用操作一填补 \(d_u-d_{fa_u}\)。
再对这个东西长链剖分即可,理清思路很好维护。
P14134 【MX-X22-T5】「TPOI-4E」Get MiN? Get MeX!
有一个隐藏的 \(0\sim n-1\) 的排列 \(a_1, \ldots, a_n\),不自适应,你可以对这个排列进行若干次询问:
-
给定一个集合 \(S\),交互库给出 \(\min_{x\in S}a_x+\operatorname*{mex}_{x\in S}a_x\) 的值,此类询问至多使用 \(35\) 次。
-
给定一个集合 \(S\),交互库给出 \(\min_{x\in S}a_x-\operatorname*{mex}_{x\in S}a_x\) 的值,此类询问至多使用 \(1\) 次。
询问之后,你需要计算出排列中 \(0\) 的位置。
\(1 \le n \le 10^5\)。
若序列没有 \(1\),则存在 \(0\) 返回 \(1\),否则返回 \(>1\),可以使用 \(\log n\) 次询问找到 \(0\)。
接下来考虑怎么扔掉 \(1\),我们希望将 \(0,1\) 分在不同组中。
发现若 \(0,1\) 在不同组中,则询问任意一组答案为 \(1\),否则询问任意一组答案 \(>1\)。
考虑二进制分组,按照这个二进制位的取值来分组,那么当运行到 \(0,1\) 的第一个不同二进制位一定能区分出来,询问次数 \(17\)。
然后确定 \(0\) 在哪边就需要一次询问二。
还有更厉害的做法!!
考虑将随机分成两个集合,则期望 \(2\) 次将 \(0,1\) 区分开。
再找到 \(0\) 的那边,再二分找 \(0\) 即可。
AT_arc207_a
QOJ833
CF2152E
有一个长度为 \(n^2+1\) 的排列,可以证明他存在长度为 \(n+1\) 的单调子序列。
你需要交互求出任意一个,每次询问你可以知道若干下标前缀最大值的下标。
证明可以考虑那个反链和链覆盖的定理。
由此考虑构造,不断取出前缀最大值,若长度 \(>n\) 则直接合法,否则证明删去之后序列依旧存在单调子序列,且若是下降的,开头一定能接上一个,因为是前缀最大值,故询问 \(n\) 次即可。
CF2152F
给出非递减序列,每次询问一个区间的最大子集大小:满足子集任意三个值的 \(\max-\min > z\),\(z\) 为定值。
\(n\le 2\times 10^5\)。
贪心是从左往右加入,每次加入最小的合法数。
预处理出 \(R_i\),则下次加入合法数为 \(\max(y+1,R_i)\)。
直接记忆化就过了。
排列(perm)
给出长度为 \(n\) 的序列 \(a\),求置换数,满足:
\(n\le 5\times 10^3,1\le |a_i|,C\le 10^9\)。
可能更简单的方法。
先考虑全正数。
定义 \(R_i\) 为最大 \(j\) 使得 \(a_j a_i\le C\),则 \(i\) 能与 \([1,R_i]\) 接触,\(R_1\ge R_2\ge \cdots R_n\)。
初始想法是从小到大或从大到小加入,维护连续段状态,但是这样限制完全不能处理。
我们希望找到一个加入顺序,使得限制可以合并处理。
不妨考虑按照 \(i\le R_i\),\(i> R_i\) 分成一二两类,其实分界点就是最大数 \(a_x^2\le C\)。
对于一类,从后往前加,可以使得之前加入的一类都可接触,二类可接触点集合不断扩展。
对于二类,从前往后加,可以使得之前加入的二类点都不可接触,一类不可接触点集合不断扩展。
从分界点开始做类似双指针的加入。
令 \(i\) 从 \(pos\to 1\),每次先加入 \((R_{i+1},R_i]\) 的二类点,再加入 \(i\) 这个一类点。
这样的好处是,二类点的限制是不能和之前加入的所有点接触,即他能做的操作只有新开一段。
加入一类点的限制是没有限制,即他能做的操作有新开一段,合并两端,扩展一段。
故令 \(f_j\) 表示当前共有 \(j\) 段的方案数。
若同时有正负数,可以先内部处理所有正数分成 \(j\) 段的方案数与负数分成 \(k\) 段的方案数。
由于正负数可以任意接触,故枚举正数段数,负数只能将中间间隙都补上,额外讨论开头结尾颜色即可合并。
CF2152G Query Jungle
给出颜色为 \(0/1\) 的树,操作为:
- 子树翻转
- 求出最小数 \(k\),使得存在 \(k\) 条从根开始的链覆盖所有 \(1\) 点。
\(n\le 2\times 10^5\)。
ddp 即可。
CF2152H
给出带正整数边权的树,若为每个顶点分配 \(x_i\) 的非负正数权值,定义 \(f(x_i)\) 为每种将点染色成 \(0/1\) 的方案中,颜色 \(0\) 点权加颜色 \(01\) 边的最小值。
\(q\) 次询问给出 \(l_i\),求 \(f(x_i)\ge l_i\) 的要求下,\(\sum x_i\) 的最小值。
\(n,q\le 2\times 10^5\)。
H1 的一种方法是子树从下往上贪心,但是这个不好扩展。
考虑一个调整:对于 \(00\) 边 \(e_1\) 和 \(01\) 边 \(e_2\),若 \(w(e_1)\le w(e_2)\),则断开 \(e_1\),删除与 \(e_2\) 连接的联通块,不劣。
这样联通块数量为 \(O(n)\),钦定最小边然后不断扩展即可。
这个其实就是 kruskal 重构树的子树。
那么同时维护 \(\sum x_i\) 的最小值,\(ans_u=\max(ans_{lc}+ans_{rc},L-sum(u))\)。
考虑将维护 \(ans_u(L)\) 这个凸函数,slope trick 维护即可。
挑战自动机(dfa)
给出一个每个点出边为 \(2\) 的自动机(输入两个字符能到的状态),并给出两个初始点,求最短字符串长度使得可以区分出这两个状态是不同的(即终点颜色不同)。
\(n\le 2\times 10^6\)。
首先有暴力 bfs 做法。
赛时做法是:观察到当两点到最近的异色点距离不同时,可以结束;再加个始终无法优于当前答案的状态剪枝就过了。
如果从 \((a,b)\) 出发,始终无解,称 \((a,b)\) 不可区分,发现不可区分是等价关系,会形成若干等价类,每个等价类两两不可区分。
那么,如果 bfs 过程中加入了 \((a,b)\),\((b,c)\),则状态 \((a,c)\) 是无用的。
这是因为我们 bfs 的过程相当于求 \((a,b)\) 的 lcp,因为 \(\min(lcp(a,b),lcp(b,c))\le lcp(a,c)\),所以 \((a,c)\) 无需加入,使用并查集维护即可。
时间复杂度 \(\mathcal O(n\alpha(n))\)。
CF2159
双序列扩展(expand)
记满足 \(B_i\equiv B_{i+1} +-1 \pmod R\) 的序列合法。
给你一个序列,你需要找到两个不交的合法子序列使得长度和最大。
范围可以开更大。
考虑网络流,建模后,答案就是流两次的最大流。
可以先快速预处理出最短路,第二次流使用原始对偶即可。
过河卒(zu)
给出 \(n\times n\) 的棋盘,\(m\) 个棋子在对角线严格上方。
有 \(k\) 轮,每轮每个棋子都会操作,等概率选择一下四种方案之一操作:
- 等概率移动到这一行不在原点且不在对角线上的一个点。
- 等概率移动到这一列不在原点且不在对角线上的一个点。
- 沿对角线翻折。
- 关于棋盘中心对称。
求 \(k\) 次操作后,对角线下放棋子数目的期望。
\(n\le 10^9,m\le 10^5,k\le 10^{10^6}\)。
对 \(E([x<y])\) 的四种操作讨论,发现需要依赖 \(E(x-y)\),再推导,可以发现 \(E(x-y)\) 的递推式,矩阵优化即可。
Hack!(hack)
神探(god)
有 \(n\) 只变色龙,一开始都是蓝色。
你每次可以指定一只变色龙,并指定其吃下一个蓝色或红色的球。
一只变色龙吃完一个球后从蓝色变成红色,当且仅当其吃过的红球比蓝球多;从红色变成蓝色,当且仅当其吃过的蓝球比红球多。
求经过 \(k\) 次喂球后,所有变色龙都变成红色的方案数。
注意到喂 \(k\) 次后一个人变成红色的方案数恰好是 \(2^{k-1}\)。
现在问题变为求分配人的方案使得每个人都被分配到,容斥即可,最后指定颜色的方案数易得。
月食(weep)
给你 \(n\) 对数字 \((a_1,b_1),(a_2,b_2),\cdots,(a_n,b_n)\)。
对于一个正整数 \(m\),令 \(f(m)\) 表示有多少数字 \(i\in[1,n]\) 满足 \((a_i\bmod m)< (b_i\bmod m)\)。
问 \(\max_{m\ge 1}f(m)\) 是多少,以及取到最大值的所有 \(m\) 的和。
\(n\le 5\times 10^5,0\le a_i,b_i\le 3\times 10^6\)。
注意到条件拆开后类似于 \(a_i-b_i<m(\lfloor\frac{a_i}{m}\rfloor-\lfloor\frac{b_i}{m}\rfloor)\)。
将 \(m\) 弄过去后再稍微搞一搞,发现 \(\lfloor\frac{a_i}{m}\rfloor-\lfloor\frac{b_i}{m}\rfloor\) 与 \(\lfloor\frac{a_i-b_i}{m}\rfloor\) 相差不超过一,且为 \(1\) 的时候就是满足条件的。
故最终条件变为 \([(a_i\bmod m)<(b_i\bmod m)]=\lfloor\frac{a_i}{m}\rfloor-\lfloor\frac{b_i}{m}\rfloor-\lfloor\frac{a_i-b_i}{m}\rfloor\)。
瘦子(skinny)
给出两棵包含 \(n\) 个顶点的树,边带权。
\(q\) 次询问给出点 \(a,b\),求 \(\max_{c=1}^n dis_1(a,c)+dis_2(c,b)\)。
\(n\le 2\times 10^5,q\le 5\times 10^5\)。
枚举 \(a\),记 \(d_i=dis_1(a,i)\)。
考虑在第二棵树上每个点 \(i\) 挂一个虚点,边权为 \(d_i\)。
问题变为求距离 \(b\) 最远的点,考虑求出直径。
在第一棵树上换根,第二棵树上维护括号序,可以支持区间加,求直径。
bugaboo(bugaboo)
你有三个正整数 \(n,m,K\) 和一个长度为 \(m\)、值域为 \([0,K-1]\) 的自然数的序列 \(b_{[1,m]}\)。
我们定义一个长度为 \(n\)、值域为 \([0,K-1]\) 的自然数的序列 \(a_{[1,n]}\) 是好的,当且仅当可以通过执行以下操作若干次,使得序列的前 \(m\) 项与 \(b\) 序列吻合:
- 转化为新序列 \(a'_{[1,n]}\),其中 \(a'_1=a_n,\forall 1\le i<n,a'_{i+1}=a_i\)。
求好的长度为 \(n\)、值域为 \([0,K-1]\) 的自然数的序列的数量。
\(m\le n\le 8000,K\le 10^9\)。
要求 \(a\) 环上存在匹配位置的方案数,容斥成不存在匹配方案的方案数。
再钦定一个集合存在匹配位置。
考虑相邻两个位置 \(x<y\),那么对于 \([x,y-1]\) 之间的元素,他们的取值方案数为:
- \(y-x\ge m\),\(K^{y-x-m}\)。
- \(y-x<m\),要求 \(b\) 存在对应
border,则方案数为 \(1\)。
特别地,对于环末尾和开头,方案数也是如此。
我们钦定从 \(S_{\min}\) 开始选择,记录下最后 \(S_{\max}\) 的位置,最后一段的方案就能算了,再旋转回开头。
时间复杂度 \(\mathcal O(n^2)\)。
代码(code)
给出 \(n,k\),初始你有一个长度为 \(n\) 的序列 \(c\),将其进行 \(k\) 次如下操作:
- 用 \(d_i\) 统计 \(c\) 中 \(i\) 的出现次数。
- 令 \(\forall i\in[1,n],c_i\leftarrow d_i\)。
求在初始 \(c\) 任意指定且满足 \(c_i\ge 0\) 且 \(\sum c_i\le n\) 的情况下,可以得到多少不同的 \(c\)。
判断一个 \(c\) 能否被达到,发现在计数器转原序列的时候按降序排列可以使下次计数器展开后序列更优,而限制即为展开一开始的 c 得到的序列长度 \(\le n\)。
对于 \(k=1,2\),dp。
对于 \(k>2\),预处理。
宝石(gem)
有 \(n\) 栋大楼排成一排,第 \(i\) 栋大楼高 \(h_i\) 层。记 \((i,j)\) 表示第 \(i\) 栋楼从底往顶的第 \(j\) 层。
从第 \(i\) 栋大楼某一层走到其上一层或下一层需要花费 \(tv_i\) 秒。
你希望修建 \(n-1\) 条水平天桥,每条天桥连接高度相等的两层楼,对于一条连接 \((u,x),(v,x)\) 的天桥,以下条件需要被满足:
- \(h_u\ge x,h_v\ge x\);
- 对任意 \(w\in (u,v)\),均有 \(h_w<x\)。
通过一条水平天桥需要花费 \(th\) 秒。这些天桥需要满足以下条件:
- 图联通。
- 令 \(R=\sum_{i=1}^n h_i\)。如果我们给每栋楼的每层楼编号(编号从 \(1\) 到 \(R\)),你希望最小化 \(\sum_{1\le x<y\le R}d(x,y)\)。
请输出这个最小的 \(\sum_{1\le x<y\le R}dis(x,y)\)。
\(n\le 60,1\le h_i,R\le 3000,1\le th,tv_i\le 10^6\)。
考虑区间 dp,\(f_{l,r,m,x}\) 表示。区间的大楼扔去 \((m,x)\) 严格上方的东西作为子树时(且以 \((m,x)\) 为根)的最小贡献
定义辅助数组 \(g_{l,r,m,x}\) 表示区间的大楼扔去 \((m,x)\) 严格下方的东西作为子树时(且以 \((m,x)\) 为根)的最小贡献,\(h_l{l,r,m,x}\) 表示右边存在一条连向 \((m,x)\) 的边,且以 \((m,x)\) 为根时的最小贡献,\(h_r\) 同理。
注意 \(m\) 可以不在区间内。
对于 \(f\) 的转移,若这个根不存在往外的边,就往上往下换根,否则假设往左连边,则一定连接到左边第一个存在的位置,然后枚举左侧分到的区间,拆成一个向上的 \(h_l\) 和右边的 \(f\) 即可。
对于 \(h_l\) 的转移,若上面还有边,就枚举分界点,拆成下面的 \(f\) 和上面的 \(G\)。
对于 \(g\) 的转移,同理可以向上换根,假设往左连边,也可以拆成一堆东西。
感觉这种东西就硬拆,一步一步将要记的东西存下来,结构就很少。
写得太随意了,有空修一修。
P14203 这次要永远 做朋友
给出序列 \(a\),定义 \(f(l,r)\) 为区间绝对众数,若不存在则为 \(inf\)。
求 \(\operatorname{mex}(l,r)\ge f(l, r)\) 的区间个数。
\(n\le 3\times 10^6,0\le a_i\le n\)。
固定绝对众数 \(t\),则区间还需满足 \([1,t]\) 出现过。
设 \(t\) 为 \(1\),非 \(t\) 为 \(-1\),则绝对众数条件等价于区间和 \(>0\)。
对左端点扫描线,需要求出最小右端点使得 \([1,t]\) 出现过。
相当于 \(\max_{i=1}^{t}nxt_i\),从前往后扫即可求出。
而对于左端点的答案,就是前缀和序列在这个区间的逆序对个数,由于前缀和序列相差为 \(1\),即值域每次只变化 \(1\),维护桶即可 \(\mathcal O(n)\) 求出 \(t\) 的答案。
关键性质:绝对众数为 \(t\) 的区间覆盖的总位置只有 \(\mathcal O(cnt_t)\) 个。
求出这些位置跑上面算法就行了。
时间复杂度 \(\mathcal O(n)\)。
P14144 Strange Alice Game II
对于每个区间 \([l,r]\) 问有多少个 \(a_i\) 满足其在 \([l,i−1]\) 没有出现,并且 \([l,i−1]\) 所有数去重之后比 \(a_i\) 小的至多 \(k−1\) 个。
\(k\le n\le 2\times 10^5,q\le 10^6\)。
一个点有贡献的区间就是 \(pre\) 数组中 \([1,a_i]\) 的第 \(k\) 大。
问题变成单点修改,区间第 \(k\) 大。
考虑整体二分,先处理 \([l,mid]\) 的修改,得到每个询问答案的去向,再递归下去。
时间复杂度 \(\mathcal O(n\log^2+q\log n)\)。
P14181 「FAOI-R8」Hotel California
有编号从 \(0\) 开始的无穷个房间。
有 \(n\) 个计划 \((t,x,d)\):
- 若 \(t=1\),修建 \(u\to u+x\) 的有向道路,只有第 \(d\) 小时可以通过。
- 若 \(t=2\),修建 \(u\to (2u\bmod x)\) 的有向道路,只有第 \(d\) 小时可以通过。
初始你在 \(0\) 房间,第 \(0\) 小时,而第 \(i\) 小时你至多经过 \(c_i\) 条道路。
对于 \(i\in [1,m]\),求至少第几小时可以到达房间 \(i\)。
\(n\le 20,m\le 10^5,,1\le x_i\le m, 0\le c_i\le 10^9,1\le d_i\le n\)。
若房间数较少,对每个小时的边建图跑最短路,距离 \(\le c_i\) 的状态就能达到。
注意到使用操作二后,房间位置 \(\le m\),即使会跑到较大的房间,但是我们只关注其 \(\bmod x_i\) 的值。
所以我们新建一些状态,表示钦定之后会使用的二操作,那么信息就存的下了。
总时间复杂度 \(\mathcal O(n^2m)\)。
P14182 「FAOI-R8」豹邻跑恒
一棵 \(n\) 个点的无根树,初始有 \(m\) 个点是猎豹的领地。为了争夺领地,你可以在一开始派出一些人占据一些没有猎豹的点,使第 \(i\) 个点变为人的领地需要花费 \(a_i\) 代价。
部署完后,每天依次发生以下事件:
- 人开始扩张领地,每个与原来的人的领地相邻且不是猎豹领地的点变成人的领地。
- 猎豹开始扩张领地,每个与原来的猎豹的领地相邻且不是人领地的点变成猎豹的领地。
当所有节点都被人和猎豹占领时,每个被猎豹占领的节点会使你花费 \(k\) 代价,现求一种部署方案使总代价最小。
\(1\le m< n\le 2\times10^6,1\le k,a_i\le 10^9\)。
????
P11427 [清华集训 2024] 绝顶之战
有一个长度为 \(m\) 的一维空间,还有 \(n\) 个物品,第 \(i\) 个物品的长度为 \(a_i\)。现在按照编号从小到大的顺序依次将物品放入空间中,对于第 \(i\) 个物品:
- 如果当前空间中存在一段连续的长度至少为 \(a_i\) 的空余,则你必须将第 \(i\) 个物品放入一段连续的长度为 \(a_i\) 的空余空间中,可放实数位置。
- 否则,第 \(i\) 个物品无法被放入,跳过它。
你需要输出:按照编号从小到大的顺序考虑完所有物品后,所有可能的空间占用长度,它的定义是所有被放入空间的物品的长度之和。
\(m,a_i\le 10^{16},n\le 14\)。
从前往后段会不断分裂。
从后往前考虑。
可放入的条件相当于将相邻两个段合并并加上 \(a_i\)。
不可放入的条件相当于当前的所有段长度 \(<a_i\)。
如果一个 \(x\) 存在方案把恰好 \(S\) 中的元素放入,则 \(<x\) 且 \(\ge \sum_{i\in S} a_i\) 的也是合法的,具有单调性,故只需知道最大的合法 \(x\),判断是否 \(\ge m\) 即可。
设 \(f_{i,S,T}\) 表示考虑 \([i,n]\) 的数,\(T\) 里的数不被选择,最长的一个段满足其可以恰好选择 \(S\)。
若 \(i\in S\),有:
若 \(i\in T\),有:
分析一下复杂度,相当于枚举 \(S’,S,T\) 的复杂度,为 \(\mathcal O(4^n)\)。
P11420 [清华集训 2024] 乘积的期望
有一个长度为 \(n\) 的序列 \(a_1, a_2, \cdots , a_n\)。初始序列的所有元素均为 \(0\)。再给定正整数 \(m\)、\(c\) 和 \((n - m + 1)\) 个正整数 \(b_1, b_2, \cdots , b_{n−m+1}\)。
对序列 \(a_1, a_2, \cdots , a_n\) 进行 \(c\) 次操作,每次操作为:
- 随机选择整数 \(1 \le x \le n - m + 1\),其中选到 \(y\)(\(1\le y\le n-m+1\))的概率为 \(\displaystyle \frac{b_y}{\sum_{i=1}^{n-m+1} b_i}\)。将 \(a_x, a_{x+1}, \cdots, a_{x+m−1}\) 增加 \(1\)。
\(c\) 次操作中对 \(x\) 的随机是独立的。
求操作完成后序列中所有元素的乘积的期望。
\(2 \le m \le n \le 50\),\(1 \le c < 998244353\),对于 \(1 \le i \le n - m + 1\),\(1 \le b_i \le 10^5\)。
QOJ14141 Lice Hopping
????
P14256 平局(draw)
定义一个石头剪刀布序列的价值为:每次选择两个相邻的人进行战斗,省着留下,若平局价值加一,求最后剩下一人时的价值最大值。
现在给你若干限制形如第 \(i\) 的位置的手势只能在某个子集里选择,求所有方案下的价值之和。
\(n\le 3000\)。
先手搓了一个暴力,维护一个栈,先将配对中间数 \(<2\) 的先做了,最后再扫一遍栈将中间数 \(=2\) 的做了。
然后就卡住了。
其实,你观察一下剩下栈的形态,由于不存在中间数 \(<2\) 的配对,最后一定是形如 ...<<<>>>... 的。
不难发现可以快速求出答案。
dp 也是很好推的。
AT_abc378_g [ABC378G] Everlasting LIDS
求长度为 \(AB-1\) 的排列数量,满足:
- 最长上升子序列为 \(A\)。
- 最长下降子序列为 \(B\)。
- 存在整数 \(n\),使得在 \(P\) 末尾添加 \(n+0.5\) 后,\(P\) 的 LIS 和 LDS 也不会变化。
\(AB\le 120\)。
考虑用杨表分析问题。
原排列杨表为 \(A\times B\) 矩阵缺一个角,根据排列与形状相同的杨表对一一对应的性质,第二个杨表(每个位置记录加入的时间)可以用钩长公式计算。
条件可以转化为插入一个数后恰好补全了这个角,即 \(\forall i\in [1,B),t_{i,A}>t_{i+1,A-1}\)。
由于 \(AB\) 较小,可以使用 \(\binom {A+B}{A}\) 的状态数进行轮廓线 dp。
注意,dp 的过程是从小到大考虑每个数会插入到哪,而不是模拟 rsk 算法。
区间(interval)
对一个长度为 \(n\) 的序列 \(a_1, a_2, ..., a_n\),定义 \(f(l, r) = \max_{i=l}^{r} a_i \times \min_{i=l}^{r} a_i\)。对于所有 \(1 \leq l \leq r \leq n\) 的 \(\frac{n(n+1)}{2}\) 个 \((l, r)\) 对,求 \(f(l, r)\) 前 \(k\) 大的和。
\(n\le 5\times 10^5,k\le \frac{n(n+1)}{2},1\le a_i\le 10^9\)。
二分答案 \(M\),钦定 \(\max\) 为 \(a_i\),则要求为 \(\min \ge \frac{M}{a_i}\),即区间不能包含不合法的数。
考虑将 \(a_i\) 从小往大扫,则不合法的数不断删除,使用并查集即可找出此时向左向右第一个不合法数。
现在问题变成了 \(l\) 在一个区间,\(r\) 在一个区间,不交且恰好连接,求 \(\min\) 的和,使用历史和线段树即可。
时间复杂度 \(\mathcal O(n\log V\alpha(n))\)。
抽卡2(card)
现在在卡池里面有 \(n\) 类卡牌,每张卡牌分别有 \(a_1, a_2, ..., a_n\) 个。小巡想要 \(b_i\) 张 \(i\) 类型的卡牌,这样子就可以合成一个很牛的英雄小 Z。
小巡往游戏里面冲了无穷的金币,每次抽卡要使用一个金币,并且花费 1 时刻的时间。抽卡的结果会从卡池中的 \(\sum a_i\) 张卡里面随机抽出一张。
假设抽到了 \(i\),如果当前小巡已经有 \(b_i\) 张 \(i\) 类型的卡牌,则将这张卡牌丢回卡池。
你需要告诉小巡,他期望耗费多少时间才能合成一个他想要的英雄小 Z。
\(n\le 50,m\le 2\times 10^3,b_i\le a_i\le m\)。
超级 nb 的题。
在一棵概率树上,对于所有状态 \(0\le c_i\le b_i\) 且 \(c\ne b\),答案为 \(c\) 的期望时间乘上到达 \(c\) 概率的和。
而期望时间就是 \(\frac{\sum_{i}a_i-c_i}{\sum_{b_i\ne c_i}{a_i-c_i}}\)。
但是概率很不好算,不过这个随机问题很熟悉,我们通常将其与若新增不合法颜色时将这个颜色剩下的直接扔掉这个问题相互转化,因为两者每个状态的概率相同。
不过这里我们尝试转成另一个问题:随机一个牌堆中取一张牌,若取到不合法牌,就扔掉。
稍微证明一下两个问题的每个状态的概率相同:两者转到后继状态的转移概率相同,故两者的马尔科夫链相同。(这似乎能说明很有意思的问题)
设 \(c'_i=\min(c_i,b_i)\),则每个 \(c'\) 的出现时刻构成一个区间。
进入状态 \(c'\) 的概率与出去的概率相同,故考虑在每个区间的末尾处进行贡献。(开头不知道行不行,看起来就不太行)
分别是在状态 \(c'\) 停留的期望时间,到达状态 \(c\) 的概率以及切换到下一个状态的概率。
发现最难记的东西抵消了,则直接 dp 可以做到 \(\mathcal O(m^3)\)。
泪眼的代时(raet)
给你一张 \(n\) 个点 \(m\) 条边的无向带权图。点从 \(0\) 开始编号,边有边权,对每条边 \((u, v, w)\),保证 $w \in {1} \cup[ \lceil \frac{n}{3}\rceil, n] $。还保证对所有 \(w = 1\) 的边恰有 \(n - 1\) 条,他们形成一颗树。
你需要找一个经过所有点的路径,最小化边权之和。你可以经过重复的边、点。
\(n\le 5\times 10^5,m\le 2\times 10^6\)。
发现非树边最多使用一条,因为若使用,首先有直径 \(>\frac{n}{3}\),这时候代价下界为 \(n-3+\frac{2n}{3}\),不如直接树上游走,则问题变为基环树。
只有两种情况,一种是从环上一点子树进来,走过环上一段,从另一个子树出去;另一种是从环上一子树进来,绕过整个环,再回去。
需要处理每个子树的直径与最长路。
发现若额外边点距离 \(\le \frac{n}{3}\),则这是不必要的,故考虑点分治,处理不在这个点同子树的额外边,最后连通块大小 \(\le \frac{n}{3}\) 就结束。
那么我们可以通过点分治选出 \(\mathcal O(1)\) 个点,使得所有有效额外边至少经过一个点。
以这些点为根进行预处理即可,时间复杂度线性。
希望有羽毛和翅膀(hope)
有一个环上有 \(n\) 个点,第 \(i\) 个点在位置 \(l_i\),有权值\(h_i\),环长为 \(c\)。
称 \(x\) 和 \(y\) 是一个位置当且仅当 \(x \bmod c = y \bmod c\)。保证不存在两个点在同一位置。当 \(c\) 为偶数时,保证不存在 \(l_i + \frac{c}{2}\) 和 \(l_j\) 在同一个位置,即不存在根据中心点对称的情况。
环的中心也是一个点(不在环上,在圆心),其权值每次询问给定,记为 \(h_0\)。
定义两个点之前的边权为:点权的差的绝对值,即 \(|h_i - h_j|\)。
共有 \(q\) 次询问,对于每次询问给出 \(h_0\),需要把 \(n + 1\) 个点连成一棵树,但是边不能在非端点处相交。目标是最小化边权之和。
\(n \le 500, q \le 10^6, 1 \le c ,h_i\le 10^9, 0 \le l_i < c\)。
考虑中间点必须有出边,则所有连接的边不能超过半圆。
显然方案是这样的:分成若干区间,每个区间小于半圆。

中间点往这个多边形上连边可以取消一些边。
更形式化地,将断开的边删去得到若干联通块,和中间点需要往每个联通块最优点连边。
注意到,圆心最多只会连出两条边 \(x,y\),并且 \(h_x,h_y\) 一定是一个比圆心高度小,一个比圆心高度大。
考虑权值函数为绝对值,如果存在两条边比根同时大或小,可以给这两条边的端点连边,再选一个连向中间点即可。
然后就简单做了,根据根的大小情况只有 \(n\) 种情况。
Guiwow用1.8玩花雨庭暴打花雨庭玩家(guiwow)
SB tree
一棵维护所有分子分母互质分数的二叉搜索树。
设下界为 \(\frac{a}{b}\),上界为 \(\frac{c}{d}\),则根为 \(\frac{a+c}{b+d}\)。
最佳有理逼近
可以证明点到根路径拐点为 \(\mathcal O(\log\max(a,b))\) 级别。
假设往左跳 \(t\) 步,则下界不变,上界变为 \(\frac{at+c}{bt+d}\),依据这个列不等式即可解出 \(t\)。
QOJ14336 Book Sorting
给你一个排列,每次可以:
- 交换相邻。
- 将一个数移动到开头。
- 将一个数移动到结尾。
求将排列排序的最少次数。
\(n\le 5\times 10^5\)。
发现操作一定是值域前缀数扔到开头,后缀扔到结尾,中间用逆序对。
又发现这东西满足四边形不等式。
虽然是可以离线的,但是我们假设在线。
而贡献可以用莫队维护。
考虑使用在线决策单调性分治,solve(l, r) 使满足考虑了 \([0,l]\) 的决策点,知道了 \(l,r\) 当前的最优决策点,中间两个部分需要用两个莫队维护,显然移动次数为 \(\mathcal O(\log n)\)。
UOJ1004 王之沉淀
定义 U、D 操作分别为从前往后冒泡、从后往前冒泡。
定义一个字符串的分数为最少操作这个几次可以使得序列有序。
给出长度为 \(k\) 的 UD? 字符串,求分数分别为 \(0\sim n-1\) 的串分别有多少种。
\(n\le 10^5,k\le 1000\)。
玉玉了,没往 \(01\) 序列方向想。
场上想法是猜测操作顺序不影响结果,然后对每个 U 的次数二分分数进行 chk,然后 chk 用 \([1,l]\) 操作 \(c\) 次的集合为 \([1,l+c]\) 的前 \(l\) 小值这个做法。
考虑转成 01 序列,U 操作是将第一个 \(1\) 移到末尾,D 操作是将最后一个 \(0\) 移到开头。
一个排列排好序了当且仅当对于每个分界线,要么它前面没有 \(1\) 要么它后面没有 \(0\)。这个不紧的限制恰好充分,可以给我们更大的判定空间。
则排序所需轮数为:
牛牛,转成 \(01\) 序列后 U、D 就独立了!!
发现左式单增,右式单减,考虑维护相交位置。
增序维护 \(01\) 序列,修改为 \(0\to 1\),相交位置也是好维护的。
而一些神秘的查询可以用分块平衡。
时间复杂度 \(\mathcal O(nk+n\sqrt n)\)。
UOJ1005 王之钦定
给出长度为 \(n\) 的序列 \(a\),\(a_i\in[1,m]\),你可以花费 \(w_i\) 的代价将 \(a_i\) 改成任意颜色。
同时序列中颜色数 \(\le 2\) 的区间数量会作为你的贡献。
对每个前缀求出最大贡献。
\(n\le 1500, m\le 50, 0\le w_i\le 10^6\)。
观察所有的极长双连续段,必然相邻两个中间会有一个完整颜色的段为交集。
设 \(f_{i,j,c}\) 表示上一个段为 \([i,j]\) 且颜色为 \(c\)。
转移需要枚举下一个交段,并讨论段数为奇数还是偶数,中间可以选择最小代价的颜色。
然后写一大托,可以得到三个部分。
继续优化,发现极长双色连续段的中间段的最左处与最右处的颜色一定不修改。
据此,有两部分可以前缀和优化,一部分可以维护凸包。
时间复杂度 \(\mathcal O(n^2m)\)。
欧冠决赛(ucl)
给出无向图,你希望前往 \(n\) 号点并最小化时间。
对手可以在任意时刻封锁一条道路,该操作只能进行一次,封锁后,你会立即得知该信息并调整路线。同时你知晓警方会封锁某条道路,并据此规划路线。
对每个点 \(i\),求该情形下的最小时间。
\(n,m\le 2\times 10^5\)。
考虑 \(i\to n\) 的一条路径,最小时间应该对对手删除哪条边的所有情况的最小时间取最大值,这是可以从 \(n\to i\) 递推的,故使用优先队列松弛转移即可。
问题变为求出一个点删掉一条临边后到 \(n\) 的最短路。
考虑建出最短路径树,只需考虑临边为他的父边的情况。
子树内子树外连的边可以进行更新,启发式合并这个东西即可。
数学测试
双人任务
裂变天地
决胜(win)
数轴上右侧含 \(0\),有 \(n\) 颗石子,有坐标 \(a_i\),参数 \(c_i\)。
游戏如下:
- 对手选择 \(1\le L<R\le n\) 且 \(L+1\equiv R\pmod 4\),保留编号 \([L,R]\) 的石子。
- 你先手,双方轮流操作,选择非 \(0\) 石子,将其坐标减一,不能操作者输。
有一个全 \(0\) 数组 \(p\)。
游戏开始时,你可以任意次操作:
- 选择 \(1<l\le r\le n\) 且 \(l\) 不能和之前操作过的 \(l\) 相同,\(r\) 不能和之前操作过的 \(r\) 相同。
- 对于 \(1\le i\le n\),将第 \(i\) 个石子向右移动 \(\min(r-l+1,\max(0,i-l+1))\) 个长度。
- 然后修改 \(p_{l\sim r}\) 为任意整数,你需要保证 \(\sum c_ip_i\) 严格增加。
最终代价为 \(\sum c_ip_i\),请在必胜情况下,输出最小代价。
\(2\le n\le 5\times 10^5,0\le a_i\le 10^9,1\le c_i\le 10^9\)。
显然最低层的问题为奇数 \(a_i\) 得是奇数的,则 \(a_i\) 转化成奇偶,所有长度 \(\bmod 4=2\) 的区间异或和为 \(1\)。
后面那个操作考虑维护相邻异或和,惊奇地发现操作变成区间异或 \(1\)。
然后手玩一下新序列满足条件的要求,就是所有 \((1,n]\) 的数变成 \(1\)。
再维护差分序列,区间操作就变成了两个 \(1\) 的匹配,由于一个区间的代价为 \(\gcd(l,r)\)(这是因为 \(\gcd\) 的都能取到,显然取最小的)。
根据这个代价,两个区间不交是不优的,包含也是不优的,所以最后情况唯一,就是每次 \(i\) 与 \(i+\frac{len}{2}\) 匹配。
P14311 【MX-S8-T4】平衡三元组
给出序列 \(a\),\(q\) 次操作:
- 给出 \([l,r]\),求在区间中选择 \(x<y<z\) 且 \(a_y-a_x\le a_z-a_y\),最大的 \(a_x+a_y+a_z\)。
- 对 \(a\) 区间加。
\(n\le 10^6,q\le 5\times 10^4\)。
怎么秒了?
显然暴力是枚举 \(y\),\(x\) 为前面的最大值,\(z\) 为后面的最大值。
找出最大值,以左侧为例,此时 \(z\) 就是最大值。
考虑 \(a_i\) 递增的部分分,显然 \(z\) 为最大值,\(x,y\) 为相邻数,从后往前扫,碰到第一个合法的就结束,当碰到不合法时,有 \(a_y-a_x>a_z-a_y\),差翻倍,故最多跑 \(\mathcal O(\log V)\) 就会碰到合法的。
因为 \(x\) 为前缀最大值,故找出前缀最大值,对于他们中的相邻两个,用上面的算法即可。
剩下 \(x>y\) 的部分,这是一定合法的,发现只需要考虑后 \(\log V\) 个 \(x\) 即可,因为更多的话就存在相邻的前缀最大值合法了,更前面的一定不优。
时间复杂度 \(\mathcal O(n+q\log n\log V)\)。
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/19139376

浙公网安备 33010602011771号