2025.10 做题记录
qwq awa owo uwu xwx
洛谷P6620 [省选联考 2020 A 卷] 组合数问题
纯式子。
CF1278F Cards
记 \(p=\frac{1}{m}\)。
然后直接做就完了。
洛谷P6031 CF1278F Cards 加强版
对 \(i^k=\sum\limits_{j=0}^{i}\binom{i}{j}{k\brace j}j!\) 这个式子二项式反演,可以得到
可以发现前面几项都是很好做的,\(j^k\) 可以线性筛出来,\(\binom{n}{j}\) 可以拆成下降幂除阶乘的形式,现在就后面的难做。
记 \(f(i)=\sum\limits_{j=0}^{k-i}\binom{n-i}{j}(-p)^j\)。
对于中间那个组合数,可以根据 \(\binom{n}{m}=\frac{n}{m}\binom{n-1}{m-1}\) 递推一下,也就是 \(\binom{n-i-1}{k-i}=\frac{n-i-1}{k-i}\binom{n-(i+1)-1}{k-(i+1)}\)。
对于右边那个式子,可以化成 \(\sum\limits_{j=0}^{k-(i+1)}\binom{n-(i+1)}{j}(-p)^{j+1}\),也就是 \((-p)f(i+1)\)。
边界为 \(f(k)=1\)。
然后就能 \(O(k)\) 做了。
洛谷P11343 [KTSC 2023 R1] 出租车旅行
考虑一条换乘路径 \(p_1,p_2,\cdots,p_{k-1},p_k\),显然有 \(\forall i\in [1,k-2],B_{p_i}>B_{p_{i+1}}\),也就是除终点外的 \(B\) 单调递减。
因为递减这个性质是不把终点算进去的,所以可以让全程的 \(B\) 都递减,最后再统计一遍答案。
记 \(f_i\) 表示走到 \(i\),且全程的 \(B\) 单调递减的最小费用。转移是很好想的:
\(f_i=\min\limits_{B_j>B_i}\{f_j+A_j+B_j\times dis(i,j)\}\)
可以感知到这个玩意是个一次函数状物,但是 \(dis(i,j)\) 是一个比较难处理的东西,因此拉到点分树上,\(dis(i,j)\) 就是 \(dis(i,s)+dis(j,s)\),\(s\) 为当前重心,就能用李超树做了。
把点按 \(B\) 从大到小排序,每次枚举祖先把 \(f_i\) 搞出来,然后在它祖先的李超树上都插个一次函数进去,统计答案和查询 \(f_i\) 是一样的。
洛谷P6881 [JOI 2020 Final] 火灾 / Fire
这个玩意瞪着看很难看出啥,可以打个表:
8 8 8 8 8 8 8
8 8 8 8 8 8 8
8 8 8 8 8 8 6
8 8 8 8 8 6 6
8 8 8 8 6 6 4
8 8 8 6 6 4 4
8 8 6 6 4 4 2
8 1 6 3 4 2 1
最下面是时刻为 \(0\) 的样子,最上面是时刻为 \(n\) 的样子。
可以发现每个位置的贡献都是一个平行四边形,不过可能只有一部分在这个正方形里。可以把平行四边形差分成三个边长无限的三角形,查询差分成一行的前缀和。平行四边形的大小和这个位置左边第一个大于等于它的位置、这个位置右边第一个大于它的位置有关。
然后就不难了。把查询和三角形都按照顶点的 \(x\) 从小到大排序。维护在这个查询左边和不在这个查询左边的三角形,把式子拆一下后用四个树状数组简单维护就行。
洛谷P8867 [NOIP2022] 建造军营
简单题。
可以发现割掉一个边双里的边是没用的,所以可以缩成几个边双,\(a_i\) 表示第 \(i\) 个边双的点数,\(b_i\) 表示第 \(i\) 个边双的边数。
缩完点后有个很好的东西,就是图变成了一棵树。对于两个被选上的点,它们路径上的边都是要选上的,不然就爆炸了。
考虑对这个玩意树形 dp。记 \(f_i\) 表示只有 \(i\) 子树里的点和边会选,至少选一个点,而且选的点连上 \(i\) 的方案数,\(g_i\) 表示 \(i\) 子树里一个点都不选(边可能会选)的方案。
转移:
\(f_u=f_u\times f_v+f_u\times g_v\times 2+g_u\times f_v\)。第一项表示 \(u\) 和 \(v\) 都选,那么 \((u,v)\) 必须选。第二项表示 \(u\) 选 \(v\) 不选,那么 \((u,v)\) 选不选都行。第三项表示 \(u\) 还没选,\(v\) 选,那么 \((u,v)\) 必须选。
\(g_u=g_u\times g_v\times 2\)。\(u\) 和 \(v\) 的子树里都不选,\((u,v)\) 随便。
初始化为 \(g_u=2^{b_u},f_u=2^{a_u+b_u}-2^{b_u}\)。
统计答案是简单的,\(ans=\sum\limits_{u=1}^{n}f_u\times 2^{c_u}\),其中 \(c_u\) 表示不在 \(u\) 子树里,也不是 \(u\) 和它父亲连的边的边数。
洛谷P11292 【MX-S6-T4】「KDOI-11」彩灯晚会
厉害。
合法链表示长度为 \(l\) 的链。
考虑 \(\sum cnt^2\) 的组合意义,也就是选出两条长度为 \(l\) 的合法链的方案数。
对于两条合法链,它们颜色相同的方案数 \(k^{n-2l+c+1}\),其中 \(c\) 表示这两个链重叠的点的个数。可以发现答案只和 \(c\) 有关,所以可以计算恰好重叠了 \(c\) 次的链的方案数,记为 \(f_c\)。
恰好重叠 \(c\) 次看起来就比较难算,可以容斥一下,算钦定重叠 \(c\) 次的方案,记为 \(g_c\)。不难得出 \(g_i=\sum\limits_{j=i}^{l}\binom{j}{i}f_j\),二项式反演一下变成 \(f_i=\sum\limits_{j=i}^{l}(-1)^{j-i}\binom{j}{i}g_j\)。
在拓扑序上 dp。用 \(f_{u,v,k}\) 表示从 \(u\) 走到 \(v\),链长度为 \(k\) 的方案,\(dp_{u,l1,l2,k}\) 表示现在走到 \(u\),链一长度为 \(l1\),链二长度为 \(l2\),重叠了至少 \(k\) 次的方案,转移就是枚举下一个重合点和两条链长了多少,也就是 \(dp_{v,l1+\Delta1,l2+\Delta2,k+1}\gets dp_{u,l1,l2,k}\times f_{u,v,\Delta1}\times f_{u,v,\Delta2}\),时间复杂度为 \(O(n^3l+n^2l^5)\),显然过不了。转移的时候把 \(l1\) 和 \(l2\) 两维分开转移可以去掉一个 \(l\),也就是 \(O(n^3l+n^2l^4)\),但还是过不了。
这个转移看起来就很怪,估计不能继续优化,所以不妨猜测要推式子。
考虑把 \((k-1)^j\) 乘进 \(g_j\) 里,也就是转移的时候多乘一个 \(k-1\),然后就做完了。
洛谷P10879 「KDOI-07」对树链剖分的爱
神秘。
对于一般的链加操作,除了树剖还能暴力跳。
可以先给一个多项式做法。从 \(u,v\) 开始,每次跳编号大的那个点,不妨设 \(u<v\),枚举父亲,给 \(v\) 的答案加上 \(w\),然后让 \(w=\frac{w}{r_v-l_v+1}\),再跳到父亲。
可以发现这个过程可以放到一个数组上,给所有操作一起跑,转移可以用差分优化。
qoj7419 Jiry Matchings
请输入文本。
这种题直接上去瞪眼肯定是不行的(x。有一个显然的 \(O(n^2)\) dp,就是设 \(f_{i,0/1,j}\),表示只考虑 \(i\) 子树里,\(i\) 有没有匹配上,共有 \(j\) 个匹配的最大值,转移是 简单的,\(f_{u,0,i}\gets\max\limits_{j+k=i}\{f_{u,0,j}+\max\{f_{v,0,k},f_{v,1,k}\}\},f_{u,1,i}\gets\max\{\max\limits_{j+k=i}\{f_{u,0,j}+\max\{f_{v,0,k},f_{v,1,k}\}\}+w(u,v),\max\limits_{j+k=i}\{\max\{f_{u,0,j},f_{u,1,j}\}+\max\{f _{v,0,k},f_{v,1,k}\}\}\}\)。
这种犹如屎一般的转移显然是不能直接优化的。把状态改一下变为只考虑 \(i\) 子树里,\(i\) 可不可以匹配,共有 \(j\) 个匹配的最大值,转移是 \(f_{u,0,i}\gets\max\limits_{j+k=i}\{f_{u,0,j}+f_{v,1,k}\},f_{u,1,i}\gets\max\{\max\limits_{j+k=i}\{f_{u,0,j}+f_{v,1,k}\}+w(u,v),\max\limits_{j+k=i}\{f_{u,1,j}+f_{v,1,k}\}\}\)。虽然一样是屎,不过好看了点。其实没有好看,是我太菜了。
根据一些网络流知识可以得到,如果把 \(f_{u,0/1}\) 看成一个函数,那么它们都是凸函数,所以可以维护一个上凸包,\((max,+)\) 卷积就是做个闵可夫斯基和。
但是闵可夫斯基的复杂度是 \(O(\lvert A\rvert+\lvert B\rvert)\),总复杂度还是 \(O(n^2)\) 的。
直接上神秘手法。树剖,对于每个点先求出不考虑重儿子的 \(f\),最后在链顶合并,合并轻儿子和重链都可以分治一下。合并重链的时候还要考虑当前分治区间的链顶和链尾有没有匹配,复杂度是 \(O(n \log^2 n)\) 的。
洛谷P5642 人造情感(emotion)
调 emo 了。
不妨先把 \(W(U)\) 求出来。这个是简单的,记 \(f_u\) 表示只考虑 \(u\) 子树的答案,\(g_u\) 表示 \(\sum\limits_{v\in son_u}f_v\),\(P(u)\) 表示端点的 lca 为 \(u\) 的路径集合。考虑转移:
如果 \(u\) 没被路径覆盖,那么贡献为 \(g_u\)。
如果 \(u\) 被路径 \((x,y,w)\) 覆盖,\((x,y,w)\in P(u)\),那么贡献为 \(w+f_u+\sum\limits_{v\in(u,v,w)}g_v-f_v\),对于每一条路径,把这一长串式子记为 \(S\)。
可以发现,对于一条路径 \((x,y)\),\(f(x,y)\) 为全局答案减去它的权值为 \(0\) 时,一定要选它的答案。而这个东西为 \(S+h_{\text{lca}(x,y)}\),\(h_u\) 表示不考虑 \(u\) 子树的答案。
用 dp 求 \(h\)。对于点 \(u,v\),\(u\) 是 \(v\) 的父亲,从 \(h_v\) 转移到 \(h_u\) 是困难的,所以考虑从 \(h_u\) 转移到 \(h_v\)。
如果 \(u\) 没被路径覆盖,有 \(h_v=h_u+g_u-f_v\)。
如果 \(u\) 被路径 \((x,y,w)\) 覆盖,就按照 \(\text{lca}(x,y)\) 分讨一下,限制为 \(x\) 和 \(y\) 都不在 \(v\) 的子树里。
如果 \(\text{lca}(x,y) = u\),那么贡献是 \(S_{(x,y,w)}+h_u-f_v\),可以把 \(P(u)\) 按 \(S\) 从大到小排个序,然后暴力枚举。
如果 \(\text{lca}(x,y)\ne u\),那么还有个限制是 \(u\) 和 \(v\) 里要有一个在 \(u\) 的子树里(另一个端点不会在 \(u\) 的子树里),贡献为 \(h_{\text{lca}(x,y)}+S_{(x,y,w)}\),这个可以放到线段树上面统计。
最后考虑怎么统计答案。根据上面说的,\((u,v)\) 对答案的贡献为 \(f_1-\left(f_{\text{lca}}+h_{\text{lca}}+\sum\limits_{v\in(u,v,w)}g_v-f_v\right)\)。
对于前两项,可以枚举 \(\text{lca}\) 算,后面那一项可以对每个点单独算贡献。
然后就会变得不 emo 了。
ARC1993C Grid Coloring 3
容易发现每个格子的颜色只最后一次操作它的操作有关,所以考虑倒序。
把一次操作删除。第一次操作是把一行和一列删了,后面的每一次操作都相当于删一行/一列/一行和一列。
记 \(f_{n,m}\) 表示 \(n\) 行 \(m\) 列的矩形的答案。
删一行和一列是等价的。考虑删行:显然不能直接枚举删哪行,因为会计重,所以考虑二项式反演一下,贡献就是 \(\sum\limits_{i=1}^{n}(-1)^{i+1}\binom{n}{i}C^if_{n-i,m}\)。
考虑删一行和一列:依旧二项式反演,贡献为 \(\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{m}(-1)^{i+j+1}\binom{n}{i}\binom{m}{j}Cf_{n-i,m-j}\)。
最终答案的形式删一行一列是差不多的,不过容斥系数要微操一下。
转移删一行一列的时候,直接枚举 \(i\) 和 \(j\) 是不行的,复杂度就变成四次方了。可以像洛谷P11292 【MX-S6-T4】「KDOI-11」彩灯晚会那样分开转移。
具体地,记 \(g_{n,m}=\sum\limits_{i=1}^{n}(-1)^{i}\binom{n}{i}Cf_{n-i,m}\),转移的贡献为 \(\sum\limits_{j=1}^{m}(-1)^{j+1}\binom{m}{j}g_{n,m-j}\)。
CF1988F Heartbeat
记 \(f_{i,j,k}\) 表示长度为 \(i\) 的排列中前缀最大有 \(j\) 个,上升点有 \(k\) 个的数量,\(g_{i,j,k}\) 表示长度为 \(i\) 的排列中后缀最大有 \(j\) 个,上升点有 \(k\) 个的数量。不难注意到 \(g_{i,j,k}=f_{i,j,i-1-k}\)。
先把答案表示出来:枚举最大值的位置,有 \(\sum\limits_{p=1}^{n}\sum\limits_{i=0}^{p-1}\sum\limits_{j=0}^{n-p}\sum\limits_{k=0}^{p-1}\sum\limits_{l=0}^{n-p}\binom{n-1}{p-1}f_{p-1,i,k}\times g_{n-p,j,l}\times a_{i+1}\times b_{j+1}\times c_{k+l+[p>1]}\)。
简单化简一下这个东西。记 \(F_{p,k}=\sum\limits_{i=0}^{p}f_{p,i,k}\times a_{i+1},G_{p,l}=\sum\limits_{j=0}^{p}g_{p,j,l}\times b_{j+1}\),上面那一坨就变成了 \(\sum\limits_{p=1}^{n}\binom{n-1}{p-1}\sum\limits_{k=0}^{p-1}\sum\limits_{l=0}^{n-p}F_{p-1,k}\times G_{n-p,l}\times c_{k+l+[p>1]}\)。这个玩意是四次方,还是不行。记 \(H_{p,l}=\sum\limits_{k=0}^{p}F_{p,k}\times c_{k+l+[p>1]}\),上面那一小坨就变成了 \(\sum\limits_{p=1}^{n}\binom{n-1}{p-1}\sum\limits_{l=0}^{n-p}H_{p-1,l}\times G_{n-p,l}\),就能三次方算了。
转移是简单的,考虑 \(1\) 插到哪就行。
- \(1\) 插到最前面会让上升点和前缀最大的个数都加 \(1\),\(f_{i,j,k}\gets f_{i-1,j-1,k-1}\)。
- \(1\) 插到最后,\(f_{i,j,k}\gets f_{i-1,j,k}\)。
- \(1\) 插到两个相邻顺序对中间,\(f_{i,j,k}\gets f_{i-1,j,k}\times k\)。
- \(1\) 插到两个相邻逆序对中间,\(f_{i,j,k}\gets f_{i-1,j,k-1}\times (i-j-1)\)
ARC186D Polish Mania
先观察 Polish 序列有啥性质:
把一个 Polish 序列 \((a_1,a_2,\dots,a_m)\) 看成将 \((a_2,\dots,a_m)\) 分成 \(a_1\) 个小的 Polish 序列,也就是一个树状结构,\(a_i\) 表示 \(i\) 的儿子数。
因为有 \(n\) 个点,于是有 \(\sum\limits_{i=1}^{n}a_i=n-1\)。
因为它是一个联通的树,所以 \(\forall \ i\in [1,n),\sum\limits_{j=1}^{i}a_j\ge i\)。
手腕一下发现这两个拼起来就是充要条件。
对于没有字典序限制的计数,可以看成从 \((0,0)\) 走到 \((n-1,n-1)\),且不碰到 \(y=x-1\) 的方案数。
有字典序限制时,可以枚举 LCP,相当于从 \((x,y)\) 走到 \((n-1,n-1)\) 且不碰到 \(y=x-1\) 的方案数,用反射容斥做一下就行。
最后还要判断一下原序列是不是 Polish 序列。
洛谷P11233 [CSP-S 2024] 染色
简单题。
先给出一个状态。\(f_{i,j}\) 表示考虑 \(1\sim i\),上一个和 \(i\) 颜色不一样的位置在 \(j\),转移是简单的。但我太菜了觉得这个没有前途,所以换了一个状态!!!
记 \(c_i=\sum\limits_{j=2}^{i}[a_j==a_{j-1}]a_j\),\(g_i\) 表示只考虑 \(1\sim i+1\),且 \(i+1\) 和 \(i\) 颜色不一样的答案,最后的答案就是 \(g_n\)。
转移是简单的,枚举上一个和 \(i+1\) 同色的位置,也就是 \(\max\limits_{j=0}^{i-1}\{[a_{i+1}==a_j]a_j+c_i-c_{j+1}+g_j\}\)。
这个是简单的,把 \(c_i\) 拉到外面,然后记录当前 \(g_j-c_{j+1}\) 的最大值和值域上的 \(v\) 对应的 \(\max\limits_{a_i=v}\{g_i-c_{i+1}\}\),就能 \(O(n)\) 做了。
洛谷P14254 分割(divide)
简单题。
可以发现,选出来的连通块(子树)的深度集合是一个区间,又发现选的点的深度是一样的,然后就基本做完了。
假设选出来的子树的深度区间为 \([l_1,r_1],[l_2,r_2],\dots,[l_k,r_k]\),那么一定有 \(\forall \ i\in (1,k],r_i\ge r_1\) 且 \(\exists \ i\in (1,k],r_i=r_1\)。
对于同一个深度的点的集合 \(S\),将他按 \(r\) 小到大排序后得到 \(p_1,p_2,\dots,p_k\)。
假设现在的第一个点是 \(u=p_i\),\(S\) 中有 \(c1\) 个点的 \(r\) 大于等于 \(u\) 的 \(r\),有 \(c2\) 个点的 \(r\) 大于 \(u\) 的 \(r\)。
容斥一下可以得到这个点的答案为 \(\binom{c1}{k-1}-\binom{c2}{k-1}\),再乘上 \((k-1)!\)。
然后就做完啦。
洛谷P4707 重返现世
题目要求的是 \(E(\min\limits_k(S))\),显然要 min-max 容斥,但是容斥后式子里会带一个 \(E(\max(S))\) 这个是不好做的。令 \(k=n-k+1\),答案就是 \(E(\max\limits_k(S))\)。
对上面那个做 min-max 容斥,就变成了 \(\sum\limits_{T\subseteq S}(-1)^{\lvert T\rvert-k}\binom{\lvert T\rvert-1}{k-1}E(\min(T))\)。
对于 \(E(\min(T))\),本质上是第一次出现 \(T\) 中元素的期望时间,出现 \(T\) 中元素的概率是 \(P(T)=\frac{\sum\limits_{i\in T}p_i}{m}\),期望时间就是 \(\frac{1}{P(T)}\)。
对这个玩意 dp。设 \(f_{i,j,k}\) 表示考虑前 \(i\) 种原料,大小为 \(j\) 且 \(p\) 的和为 \(k\) 的集合的 \(\sum\limits_{T\subseteq S}(-1)^{\lvert T\rvert-k}\binom{\lvert T\rvert-1}{k-1}\) 和。
考虑转移:
现在这个原料不加进去,有 \(f_{i,j,k}\gets f_{i-1,j,k}\)。
如果要加进去,有 \(f_{i,j,k}\gets f_{i-1,j-1,k-p_i}-f_{i-1,j,k-p_i}\),也就是把组合数拆开,然后讨论一下正负。
然后就做完了。
CF1389G Directing Edges
显然先把强炼铜分量缩一起,就变成了一棵树。
不妨令根是一个特殊点,把子树内没有特殊点的点缩到它祖先里第一个特殊点,不然就要讨论一些情况,比较麻烦。
现在就可以换根 dp 做了。先把根的答案求出来,然后每个点的答案就是,求出它父亲去掉它的答案,再贡献给它。
CF526F Pudding Monsters
简单题。
先对每个点 \((x,y)\),让 \(p_x=y\),搞成一个排列。
对于一个区间 \([l,r]\),它合法当且仅当 \(\max\limits_{i=l}^{r}p_i-\min\limits_{i=l}^{r}p_l=r-l\)。
这个是简单的,从左到右扫描线,然后用线段树和单调栈简单维护就行了。
洛谷P8860 动态图连通性
观察,如果一条边被删的第一次失败了,那么后面的那几次也会失败,所以每条边只和它第一次被删的时间有关,记为 \(t_i\),如果都没被删就搞成 \(\inf\)。
可以发现,最后保留的边一定是一条路径和一些 \(t_i=\inf\) 的边,而这条路径上的 \(t\) 从小到大排序后字典序最大。
可以用主席树维护当前点最有字典序的哈希值,每次 \(O(\log m)\) 判断,复杂度是双 \(\log\)。
qoj6545 Connect the Dots
对于一个极长颜色连续段,从它左边或右边第一个点向段内所有点连边,就能把这个段缩成一个点,这样操作是不劣的,因此不妨令相邻颜色不同。
先让相邻的两个点连边。
如果这个串是 abababab 交替,就让第一个 a 对所有不相邻的 b 连边。
如果这个串有超过三种颜色:
如果有一种颜色只出现了一次,就让它对所有不相邻的位置连边。
否则,选一个不在 \(1\) 和 \(n\) 上的颜色,一直删它直到它只剩一个,删的意思是从左边往右边连边。
qoj8085 Bulbasaur
\(f(i,S)\) 表示第 \(i\) 行的点集 \(S\) 中每个点的出边连向的点的并集。
这种形式的式子一般都是扫描线。从前往后扫感觉上就比从后往前扫难做,因为从后往前扫只用维护这一行的答案。
直接维护能不能到后面每一行比较困难,转化为维护每个点集最远能到哪行。
先思考一下弱化版:每个点集能不能到下一行。根据 Hall 定理,这个点集能到当且仅当 \(\forall \ T\subset S,|f(i,T)|\ge|T|\)。
记 \(g(i,S)\) 表示第 \(i\) 行的点集 \(S\) 最远能到哪行,\(h(i,S)\) 表示 \(f(i,S)\) 大小为 \(|S|\) 的子集中 \(g\) 的最大值,于是有 \(g(i,S)=\min\limits_{T\subset S}h(i,T)\)。
然后就做完了。
qoj14522 军训 I
???
可以发现 \(k>13\) 是无解的。
先写个暴力方便打表,顺便把 \(n\le 3,m\le 3\) 判掉,不然会有一堆 corner。
\(k=1\):全填。
\(k=2\):不妨令 \(n\le m\),第一行全填其它不填。
\(k=3\):不妨令 \(n\le m\),第二行全填其它不填。
\(k>3\) 的时候如果 \(\min(n,m)=1\) 就无解,先判掉。
\(k=4\):\((1,1)\) 填,其它不填。
\(k=5\):可以发现当 \(\gcd(n,m)=1\) 时无解。
观察一下,当 \(n=m\) 时填对角线,可以拓展一下,两维分别按照 \(\frac{n}{\gcd(n,m)}\) 和 \(\frac{m}{\gcd(n,m)}\) 分块。
\(k=6\):\(m=2\) 时填 \((2,1)\),否则填 \((1,2)\)。
\(k=7\):填 \((2,1)\) 和 \((1,2)\),如果 \(n>2\),就把 \((1,x),x>2\) 全填。
\(k=8\):全部无解!
\(k=9\):不妨令 \(n\le m\)。\(n=2,m=2\) 时无解,\(n=2\) 时填 \((1,3),(2,1)\),否则填 \((1,2),(2,1)\)。
\(k=10\):全部无解。
\(k=11\):不妨令 \(n\le m\)。\(n=2\) 时填 \((1,2),(1,4),(2,1)\),否则填 \((1,3),(2,1)\)。
\(k=12\):全部无解。
\(k=13\):\(\min(n,m)\le 2\) 无解。\(m\ge4\) 时填 \((1,4),(2,1),(2,2)\),否则填 \((1,3),(3,1)\)。
finish。
洛谷P5044 [IOI 2018] meetings 会议
先给出一个多项式做法:记 \(f_{l,r}\) 表示区间 \([l,r]\) 的答案,转移为 \(f_{l,r}\gets\min(f_{l,x-1}+(r-x+1)\times a_x,f_{x+1,r}+(x-l+1)\times a_x)\),\(x\) 是区间内最大值的位置。
这个东西感知上不能直接维护。可以发现,除查询外的状态 \([l,r]\) 都满足 \(a_{l-1}\ge \max(a_l,\dots,a_r)\) 或 \(a_{r+1}\ge \max(a_l,\dots,a_r)\),其它的都不用计,不妨让状态都满足第一个条件,第二个条件只用把序列倒过来再做一遍就行。
这种和大小关系有关的东西可以在笛卡尔树上做。记当前是节点 \(u\) 子树内的编号区间为 \([l,r]\),要求的就是 \(f_{l,l+1\sim r}\)。
求 \(f_{l,r'}\) 时,如果 \(r'<u\),那它就在左子树被算了,不管他。
如果 \(r'=u\),那么 \(f_{l,u}=f_{l,u-1}+a_u\)。
如果 \(r'>u\),\(f_{l,r'}=\min(f_{l,u-1}+(r'-u+1)\times a_u,f_{u+1,r'}+(u-l+1)\times a_u)\)。
把 \(f\) 数组按照 \(r\) 摊到序列上,显然不会有影响。前两个转移是好做的,第三个转移相当于区间加和区间对一次函数取 \(\min\)。注意到 \(l\) 固定时 \(f\) 单调不减,所以可以二分分界线,就变成了区间覆盖一次函数,这个是好做的。
询问直接挂到树上就行。
gym102586L Yosupo's Algorithm
两维都有限制比较难做,可以去掉一维。
考虑把红点和蓝点放在一起分治:若当前分治到 \([l,r]\),把 \([l,mid]\) 中的红点拉出来记为 \(S\),把 \((mid,r]\) 中的蓝点拉出来记为 \(T\),\(S\) 中权值最大的点为 \(p\),\(T\) 中权值最大的点为 \(q\)。
可以发现,在这个 y 的区间中,所有询问的答案一定会选 \(p\) 和 \(q\) 里至少一个点,证明可以考虑 \(L\) 在 \(p\) 的哪边,\(R\) 在 \(q\) 的哪边,分讨一下。
现在问题变成了:有若干个 \((x_i,y_i,w)\),每次询问一个 \(L,R\),问所有 \(x_i<L,y_i>R\) 或 \(x_i>L,y_i<R\) 的 \(w_i\) 的最大值,离线下来扫描线即可。
ARC156D Xor Sum 5
两个相同的数异或起来会抵消,可以先构造双射。
可以发现,若一个序列不是回文的,那么将它倒过来可以给它抵消掉,所以只用考虑回文的情况。
考虑 dp。记 \(f_i\) 表示 \(K=i\) 时的答案,这个状态在 \(i\) 为奇数时不好转移,因为他是一个 \(\bigoplus(\sum+a_p)\) 状物,\(a_p\) 是回文的中间项。
可以换个状态,\(f_{i,j}\) 表示 \(K=i\),每个项都加一个 \(j\) 的答案。
考虑转移:
记 \(t=\lfloor\frac{i}{2}\rfloor\)。
当 \(i\) 是偶数时,对于一个回文序列 \(a_1,\dots,a_{t},a_{t},\dots,a_1\),它的贡献是 \(2\times (\sum\limits_{k=1}^{t}a_k)+j\)。注意到左边那一项二进制最低位为 \(0\),可以拆位,贡献变成了 \(2\times (\sum a_k+\lfloor\frac{j}{2}\rfloor)+j\bmod 2\),得到转移 \(f_{i,j}\gets 2\times f_{t,\lfloor\frac{j}{2}\rfloor}+(N\times j\bmod 2)\)。
当 \(i\) 是奇数时,枚举中间项,然后就和偶数差不多了,有转移 \(f_{i,j}\gets\bigoplus\limits_{p=1}^{n}(2\times f_{t,\lfloor\frac{j+A_p}{2}\rfloor}+(N\times (j+A_p)\bmod 2))\)。
显然 \(i\) 只有 \(\log K\) 种,而 \(j\) 最大是 \(\max A_i\)。
qoj9527 A Brand New Geometric Problem
这个题看上去不是很可做。经验告诉我们,不可做题就是乱搞题。
可以发现 \(a\) 中不是 \(M\) 的因数的都是没用的。当 \(\prod a_i=M\) 时,可以加入或删除 \(1\) 让 \(\sum a_i=S\),所以 \(1\) 也是没用的。
记 \(D\) 为 \(M\) 的因子集合。考虑设置一个阈值 \(B\),对 \(M\) 小于等于 \(B\) 的因子 dp,大于 \(B\) 的爆搜,经过一些尝试可以得到 \(B=500\) 最优。
对于 dp,记 \(f_{i,j,k}\) 表示考虑了前 \(i\) 小的因子,乘积为 \(j\),和为 \(k\) 的最小代价,转移是简单的,枚举当前的因子选了多少个,然后暴力转移。
可以发现 \(j\) 这一维只能是 \(M\) 的因子,\(10^{10}\) 内最大是 \(2304\),\(k\) 我不会分析,反正开到 \(700\) 就够了。
爆搜是简单的,直接搜这个因子有几个就行。
qoj9523 Marble Race
把 \(x_i\) 取绝对值,将问题转化为:给你 \(x_1,\dots,x_n\) 和 \(v_1,\dots,v_m\),对每个 \(i\) 随机一个 \(1\sim n\) 的整数 \(j\),问 \(\frac{x_j}{v_i}\) 的中位数的期望。
把所有可能的 \(\frac{x_j}{v_i}\) 求出来,记为 \(z_i\),那么答案就是 \(\sum P(z_i=M)z_i\),\(M\) 表示中位数。
这个概率并不好求。差分一下,记 \(p_i=P(z_i\ge M)\),答案就是 \(\sum (p_i-p_{i-1})z_i\)。
这个概率本质上是序列中小于等于它的数有至少 \(\frac{m+1}{2}\) 个,而对于一个 \(z_i\),每个位置上的值小于等于它的概率都能求出来,记为 \(w_i\),再做个 dp,时间复杂度是 \(O(nm^3)\) 的,显然过不去。
考虑优化。可以发现,将 \(z\) 从小到大排序后,\(w_i\) 的总变化量为 \(O(nm)\) 的,每次变化只和那个位置有关,可以做个 \(O(m)\) 的可删背包,就优化到了 \(O(nm^2)\)。
qoj14509 二维弹球
将正方形最下面的点挪到原点上,然后旋转正方形和那个点。
这个时候,\(g\) 被拆成了与 \(x\) 轴平行的加速度和与 \(y\) 轴平行的加速度,根据高一物理知识暴力算即可。
qoj2570 Maximal Subsequence
对每个 \(i\) 求出以它为结尾的最长上升子序列长度 \(f_i\),把原问题转化为删最少的点,可以发现答案为:最大的 \(k\) 满足可以在序列中选出 \(k\) 个两两不交的最长上升子序列。
这个显然是对的:如果答案比 \(k\) 更大,那么肯定能选出更多两两不交的最长上升子序列。
然后就直接贪心。做法是对每个 \(i\),让它向所有满足 \(j>i,a_j>a_i,f_j=f_i+1\) 的 \(j\) 连一条边,就相当于在这个图上选出最多的两两不交的最长链,每次选字典序最大的链是最优的,证明不会。
写的时候不用真的把图建出来,存一下每个 \(i\) 在 \(f\) 的出现位置就可以了。
qoj4808 Great Party
先考虑对一个序列 \(a_1,a_2,\dots,a_{n-1},a_n\),先手必胜的情况是啥。
打个表可以发现先手必胜当且仅当 \(n\) 为奇数或者所有 \(a_i-1\) 的异或和不为 \(0\)。
然后跑个莫队就做完了。
qoj12212 Best Subsequence
显然二分。
对于一次 \(\text{check}(l,r,k)\),先把区间内 \(w_i\times2\le k\) 的 \(i\) 选出来,将这些点记作一类点,显然这样选一定不劣。把选出来的下标序列记作 \(p_1,p_2,\dots,p_{m}\),如果对于一个 \(i\),\(\exists \ j\in(p_i,p_{i+1}),a_j+\max(a_{p_i},a_{p_{i+1}})\le k\),那么就能给这个 \(j\) 选上,把选出来的 \(j\) 记作二类点。因为这个是在环上做的所以还要看 \(p_m\) 和 \(p_1\)。
qoj970 Best Subsequence
上面那一个题的 PLUS 版。
显然仍然是二分。
对于一次 \(\text{check}(l,r,k)\),计算区间中 \(A_i\times2\le k\) 的个数是好做的,可以用主席树简单维护。
对于一个数对 \((i,j)\),它们会在某些时候是两个相邻的一类点当且仅当 \(\max(A_i,A_j) < \min\limits_{k=i+1}^{j-1}A_k\) 或 \(i+1=j\),根据一些支配对结论可以知道这样的数对的数量是 \(O(n)\) 级别的,可以用单调栈找出来,然后用主席树简单维护。
qoj1173 Knowledge Is...
对于两个区间,如果它们有交就连一条边,答案就是这个图的最大匹配。
我对着这个玩意瞪了几分钟,然后正解是一个,特别简单的反贪???????
qoj4802 Ternary Search
可以发现单峰和单谷是等价的,只需要取相反数就行,下文中只考虑单谷。
对于一个单谷序列 \(b_1,b_2,\dots,b_m\),\(\exists \ 1\le i\le m,b_1<b_2<\dots<b_i>b_{i+1}>\dots>b_m\),如果把 \(b_1,\dots,b_k\) 全部取相反数,\(b\) 就是一个单调递增的序列。于是原问题就转化成了:对每个前缀,求出将一些数取相反数后逆序对的最小值。
考虑从前往后扫描线,同时维护答案。假设现在是前缀 \(i\),对于一对 \(1\le j<k\le i\),它们是逆序对有两种情况:
- 当 \(a_j>a_k\) 时,只要 \(a_j\) 不取反就是逆序对。
- 当 \(a_j<a_k\) 时,只要 \(a_k\) 取反就是逆序对。
因此可以维护每个位置不取反的贡献 \(b_i\) 和取反的贡献 \(c_i\),当前答案就是 \(\sum\limits_{j=1}^{i}\min(b_j,c_j)\)。
对于 \(c_i\),因为它只和 \(i\) 前面的数有关,可以用树状数组简单维护。
对于 \(b_i\),可以让他最开始减去 \(c_i\),答案就变成了 \(\sum\limits_{j=1}^{i}\min(b_j,0)+c_j\)。每次往后加一个数,都相当于对一个值域的后缀的 \(b\) 加上 \(1\),所以可以把 \(b\) 摊到值域上存,每次加完后把 \(b_i=0\) 的位置删掉就可以了。
qoj8559 \(k\)-coloring
可以发现所有 \(k\) 是偶数的情况都能规约到 \(k=2\) 的情况,所有 \(k\) 是大于 \(1\) 的奇数的情况都能归约到 \(k=3\) 的情况。
\(k=1\):
这是简单的,跑个欧拉路径就行。
qwq。
\(k=2\):
对原图拉一棵生成树出来,如果只看树边的话,跑出欧拉序就行,因为一条边只会在下去或上去的时候被标记,对于非树边直接在经过的时候标记一下就行。
\(k=3\):
先按照 \(k=2\) 的方法跑一遍,得到一个序列 \(a_1,a_2,\dots,a_t\)。
手玩一下发现,当遍历到 \(i\) 且 \(\exists \ j\in \mathbb{Z},4j+3=i\) 时,答案里要加上 \(a_{i-1}\),\(a_i\)。
P12417 基础构造练习题 1
可以发现,当 \(n\) 为奇数时无解。
证明:数列每一项相等当且仅当数列的最大值个数 \(cnt\) 等于 \(n\)。当 \(n\) 为奇数时,构造数列 \(a_i\) 为第 \(i\) 个质数,此时 \(cnt\) 为奇数当且仅当没进行任何操作,因此 \(cnt\) 不可能等于 \(n\)。
先给出一个能用的构造。分治只能在 \(n=2^k\) 的时候用,考虑每次合并两个数,也就是从 \(\underbrace{a,\dots,a}_{n个},b,b\) 合并到 \(\underbrace{c,\dots,c}_{n+2个}\)。
先把一个 \(a\) 和一个 \(b\) 乘一起:
我们想让所有项都包含一个 \(b\) 的因子。可以让后面那个 \(ab\) 和每一个 \(a\) 都做一次:
为了让前面的全部相等,可以将 \(1\) 和 \(n\),\(2\) 和 \(n-1\) 等两两配对:
现在有个很坏的事情,将后两个乘起来后会少一个 \(a\),所以可以在前面那部分保留两个 \(a\):
将最后两个乘一起,然后和两个 \(a\) 配对:
写一下后发现最大操作次数为 \(392959\)。
每次合并两个数花的次数太多,考虑直接把整个序列做完。
记 \(m=\frac{n}{2}\)。
延续上面的匹配的思想,将 \(i\) 和 \(i+m\) 操作一次,\(a_1,\dots,a_m,a_1,\dots,a_m\) 分为:
为了能匹配上,让上面那一组做个前缀积,下面那一组做后缀积,然后匹配。手腕一下,最后是:
这时候多了两个匹配不上的东西。让这两个乘一起,就变成了 \(\underbrace{\prod_{i=1}^{m}a_i}_{n-2个},a_{1} a_{m} \prod_{i=2}^{m-1}a_i^2,a_{1} a_{m} \prod_{i=2}^{m-1}a_i^2\) 的形式,做一遍上面那个合并就行。
分析一下操作次数,为 \(3.5n-7\),可以得到 \(86\) 分。
加两个东西进去操作次数太多了,肯定是要去掉的。
上面那两个剩下的东西过于诡异,一个剩了 \(a_1\),一个剩了 \(a_m\)。有一个思路是,把 \(a_n\) 和 \(a_{n-1}\) 留出来,让 \(a_1=a_{m}=a_{n-1}\),\(a_{m-1}=a_{2m}=a_{n}\),然后做一遍 \(n-2\),最后再把 \(a_{n-1}\) 和 \(a_n\) 乘上去。但这就需要做两次 \(n=3\) 的操作,显然无解,所以可以让 \(a_1=a_m\),就变成了一次 \(n=6\) 的操作,手玩一下可以得出 \(n=6\) 的 \(11\) 次解(其实就是用 \(3\) 次合并相邻两个,用 \(2\) 次合并前四个,然后做一遍加两个数)。
现在做到了 \(2050\) 次操作,距离正解只差 \(3\) 次。
可以发现,在 \(2050\) 的解中,我们做的 \(n=6\) 操作本质上是为了做两次 \(n=3\) 的情况。我们注意到,做 \(n=4\) 只需要 \(4\) 次,而 \(2\times 4=8=11-3\),也就是说可以把 \(a_2\) 和 \(a_3\) 拉出来,做两次 \(n=4\) 的合并,就能让操作次数少 \(3\),然后就能得到 \(2047\),也就做完了。记得要判 corner。

浙公网安备 33010602011771号