6/7月杂题

  • [AT_dwacon5th_prelims_d] Square Rotation/0601A

把所有点按 \((x\bmod d,y\bmod d)\) 分组,打个暴力可以发现实际上可以通过给的操作任意分配一个组内所有点的位置。

枚举答案正方形大小 len=ad+b,其中 \(0\le b<d\),记 \(c_{i,j}\) 表示 (i,j) 组内有多少个点。显然 a 一定取 \(\max\lceil\sqrt{c}\rceil-1\),当 b=d 时一定合法。所以初始设 b=d,枚举答案正方形左下角坐标 (x,y),每次尝试减小 b,如果能 \(\mathcal{O}(1)\) check 复杂度就是 \(\mathcal{O}(d^2)\) 的。

观察合法条件。以 (x,y) 为左下角的那 \(d\times d\) 个点代表了所有组。以 (x,y) 为左下角的那 \((b+1)\times(b+1)\) 个点每个点对应的组要求 \(c\le(a+1)^2\),同理这个区域上方 \((b+1)\times(d-b-1)\) 个点和右边 \((d-b-1)\times(b+1)\) 个点的组有 \(c\le a(a+1)\),剩下的是 \(c\le a^2\)。看上去直接 st 表就完了,但预处理会多 log。因为 a 取值已经确定,可以二维前缀和维护矩阵内 \(c>a(a+1)\)\(c\le a(a+1)\land c>a^2\) 的位置个数,复杂度 \(\mathcal{O}(d^2)\)

  • [AT_dwacon6th_prelims_e] Span Covering/0601B

好像很典?

先不考虑每条线段的具体位置,把它们的覆盖情况抽象成若干个连续段(不一定严格分开)。考虑从大到小放 \(L_i\),这样每次新加入一个 \(L_i\) 时会出现四种情况:

  • 被之前的一个连续段包含;

  • 不与之前每条线段相交,单独构成新的一段;

  • 与一段的一端有交,延长了这段;

  • 与相邻的两段都有交,连接了两段;

这很 dp,考虑 dp。设 \(f_{i,j,k}\) 表示考虑前 i 个 L,形成了 j 个连续段,总长度为 k 的方案数,答案就是 \(\sum f_{n,i,X}\),初值 \(f_{1,1,L_1}=1\)。考虑上述四种转移:

  • 被包含:\(f_{i-1,j,k}\times(k-j(L_i-1))\to f_{i,j,k}\)

  • 单独成段:\(f_{i-1,j,k}\times(j+1)\to f_{i,j+1,k+L_i}\)

  • 延长一段:\(f_{i-1,j,k}\times 2j\to f_{i,j,k+len},1\le len<L_i\)

  • 连接两段:\(f_{i-1,j,k}\times(L_i-len-1)(j-1)\to f_{i,j-1,k+len},0\le len<L_i\)

复杂度 \(\mathcal{O}(n^2X^2)\)。注意到 \(j\times L_i\le x\),一次转移复杂度 \(\mathcal{O}(L_i)\),所以有用的转移复杂度是 \(\mathcal{O}(nX^2)\) 的。也可以前缀和优化成 \(\mathcal{O}(n^2X)\),略微复杂。

  • [AGC029F] Construction of a tree

钦定 1 为根,然后我们会在这 n-1 个集合中确定 n-1 对父子关系。看上去这就很不可做啊,考虑一个必要条件,我们只确定每组关系中的儿子,这就变成了一个完美匹配问题。然后确定每个集合的父亲。不妨认为 1 是确定父亲的。每次任选一个确定父亲的点,让所有还没有确定父亲且包含它的集合都选择它作为父亲。

注意到,如果这样构造后所有点都确定了父亲,就构造了一个方案。否则,假设还剩下 x 个点没有确定父亲,这些点匹配的集合都不包含确定父亲的 n−x 个点,那么这些集合的并的大小也是 x,无论如何选边都会出现环,所以无解。瓶颈在求完美匹配,时间复杂度 \(\mathcal{O}(\sqrt{n}\sum c)\)

  • [ARC142E] Pairing Wizards

考虑题目限制即 \(\min(a_x,a_y)\ge\min(b_x,b_y)\)\(\max(a_x,a_y)\ge\max(b_x,b_y)\),所以我们先把 \(a_x,a_y\) 提到 \(\min(b_x,b_y)\)。如果已经满足限制了就不管了,否则相当于要把 \(a_x\)\(a_y\) 提到 \(\max(b_x,b_y)\)

假设 \(b_x\le b_y\)。考虑从 S 向 y 连 \(b_y-a_y\) 的边,y 向 x 连 inf 的边,x 向 T 连 \(b_y-a_x\) 的边,求最小割即可。但是这样会把贡献算大,因为如果有两个 x 相同的限制我只需要把 x 提到他们的 max 而不是提两遍。考虑拆点,贡献就对了。注意 S 向 y 只用连一遍。

  • [ABC347G] Grid Coloring 2

好像可以最小割做,但是感觉转成闭合子图做比较直观啊。考虑还是一个点 (x,y) 拆成 (x,y,k) 表示 \(a_{x,y}\ge k\),连 ((x,y,k),(x,y,k-1),inf)。对于相邻的两个格子,比如 (x,y) 和 (x,y+1),把贡献拆成 \(a_{x,y}^2+a_{x,y+1}^2-2a_{x,y}a_{x,y+1}\),这就是把 (x,y,k) 和 (x,y+1,k) 对应点的权值加 2k-1,然后对每对 (p,q),新建一个权值为 -2 的点,连到 (x,y,p) 和 (x,y+1,q) 上。求最小权闭合子图即可。

  • CF449C Jzzhu and Apples

有点昏头了。考虑从大到小枚举质数 \(2p\le n\),每次把它的所有没用过的倍数取出来两两配对,如果多了一个就把 2p 踢出去。为什么这样是对的捏?首先尽可能两两配对一定是最优的,只需要说明为什么要踢掉 2p。相当于我们在为后面的质数留一个数,那肯定要留尽可能容易匹配的,感性理解就是留其他的显然不如留 2p 优吧。

  • P1361 小M的作物

最小割建模。考虑源点向每个点连 \((S,i,a_i)\),每个点向汇点连 \((i,T,b_i)\)。注意到集合内每个位置都选在 1/2 中相当于都不在 2/1 中,考虑这样一种建图方式:假设当 \(\{s_{i,1},s_{i,2}\ldots s_{i,k}\}\) 都在 1 中时会产生 \(c_{1,i}\) 的价值,我们新建一个点 \(x_{1,i}\),连 \((S,x_{1,i},c_{1,i})\)\((x_{1,i},s_{i,j},\infty)\),2 也类似,注意到一个割要么把放在 2 的价值全割掉,要么放弃这个额外价值,所以这样建图很对啊。\((\sum c_{1,i}+c_{2,i})+(\sum a_i+b_i)\) 减去最小割即为答案。

  • P4249 [WC2007] 剪刀石头布

题意即给竞赛图的若干边定向,使三元环数量最多。任选三个点,考虑什么时候它们不是三元环。发现只要有一个点到另外两点都是出边时,这三个点不构成三元环。进一步地,这不仅是个充要条件,它还能不重不漏的统计每个非三元环。记 \(d_i\) 表示 i 的出度,答案即为 \(\frac{n(n-1)(n-2)}{6}-\sum\limits_{i=1}^n\binom{d_i}{2}\)

考虑拆贡献,对每个点 i 向汇点 T 连容量为 1、费用为 \(0,1\ldots n-1\) 的边,因为 \(\sum\limits_{i=1}^n(i-1)=\frac{(n-1)n}{2}=\binom{n}{2}\)。然后对每条边 (u,v) 新建一个点,源点 S 连过来一条容量为 1 的免费边,如果 (u,v) 已经确定方向的边直接连过去,没确定的就向 u 和 v 分别连一条容量为 1 的免费边,最小费用即为 \(\min\{\sum\limits_{i=1}^n\binom{d_i}{2}\}\)

  • CF367E Sereja and Intervals

感觉自己好蠢。注意到数据范围是 \(\color{red}n\times m\le 10^5\) 而不是 \(n,m\le 10^5\),且有解一定有 \(n\le m\),所以 \(n\le\sqrt{10^5}\)

最开始的想法是 \(f_{i,j,k,0/1}\) 表示考虑目前确认了 j 个区间的右端点不超过 i,最后一个区间左端点为 k,且目前有/没有以 x 为左端点的区间。区间有标号就在最后给答案乘 n! 就行。但是这样只能做到 \(\mathcal{O}(nm^2)\)。仔细观察感觉 i,j 都不像能优化的,大概率是最后一维 k 拖了后腿,思考怎么优化。

注意到我们并不关心最大的那个左端点是什么,只是为了让左端点递增。而且左右端点之间并没有太严的限制,考虑 \(f_{i,j,k}\) 表示考虑前 i 个点,确定了 j 个区间的左端点和 k 个区间的右端点的方案数。因为要保证 \(\forall i, l_i\le r_i\),让 \(j\ge k\) 就行。答案就是 \(n!f_{m,n,n}\),复杂度 \(\mathcal{O}(mn^2)\)

  • A 【0608A组】骰子/2023 WF C

总算是有道可做题了/ll

注意到 score(a,b) 就是 \(1\times(\sum[a_i>b_j])+0.5\times(\sum[a_i=b_j])\),减去 0.5|a||b| 后就是 \(0.5\times(\sum[a_i>b_j])-0.5\times(\sum[a_i<b_j])\),即 a 对 b 有优势只需要 \(\sum[a_i>b_j]\ge\sum[a_i<b_j]\)

以第二个问题为例。假设 D1=a,D2=b,注意到此时 D4 中元素取值不是随便的啊,只有 \(\mathcal{O}(n)\) 个,可以预处理 \(x_v=\sum[D_{2,i}>v]-\sum[D_{2,i}<v]\)\(y_v=\sum[v>D_{1,i}]-\sum[v<D_{1,i}]\)。不妨二分答案为 0.5+k,check 相当于我们要选一些 \(v_i\),使得 \((\sum(x_{v_i}-2nk))\ge 0\)\((\sum y_{v_i})\le 0\),注意到我们只会选至多两种最优的 \((x_v,y_v)\),且没有数量限制,直接贪心就行。复杂度 \(\mathcal{O}(n(\log n+\log \epsilon^{-1}))\)

  • B 【0608 A组】除沙/CF1693E Outermost Maximums

考虑枚举每个位置,计算这个位置要多少次才能变成零。考虑把所有元素丢到值域上。对于当前位置 i,我们将在不大于 i 的位置中出现过的元素标记成黑点,在大于 i 的位置中出现过的元素标记为白点,那么每一步相当于将当前元素跳到值域上严格在其之前的最后一个白点和最后一个黑点中较靠前的位置。这个可以大力分类讨论

但是这样太复杂了,考虑直接用矩阵维护:记 (0/1,0/1) 表示在值域上的当前区间中,从黑/白点进入区间,从黑/白点离开区间所需的最小步数。线段树大力维护即可。复杂度 \(\mathcal{O}(n\log n)\)

  • CF1750F Majority

思考一个串不合法的条件:要么开头/结尾是 0,要么最终状态下每段 0 的长度都大于两边 1 的段长之和(就是操作不动了)。定义 \(f_{i,j}\) 表示考虑 i 个位置,首尾都是 1,最终状态下末尾 1 段长度为 j 的方案数。注意到 \(\sum f_{i,j}=2^{i-2}\),且 j<i 的 \(f_{i,j}\) 挺好求,可以枚举上一段 0 和 1 的长度 k,l,则 \(f_{i,j}=\sum\limits_{k>l+j}f_{i-j-k,l}\times f_{j,j}\)。答案即为 \(f_{n,n}\)

考虑优化。记 p=i-j-k,则 p+k=i-j>p+l+j,p+l<i-2j,记 \(g_{x}=\sum\limits_{i+j=x}f_{i,j}\),这就可以 \(\mathcal{O}(n^2)\) 转移了。

  • A 【0612A组】第一题

考虑从小到大加入每个数。记 \(f_{i,j,S}\) 表示考虑前 i 个数,第 i 个数放进了大小为 j 的集合,当前每个集合大小构成的集合为 S 的答案。转移也很简单啊,在加入最小值的时候减贡献,在加最大值的时候加贡献。然后为了限制集合内不重,当 i 转移到 i+1 时,如果 \(a_i=a_{i+1}\),强制钦定 \(a_{i+1}\) 所在集合大小不大于 j。注意到一种合法的方案可以通过先加入较大的集合再加入小的集合的方式来符合限制,所以这样就不会漏也不会不合法了。题解证了一通说复杂度是 \(\mathcal{O}(nk\binom{2\sqrt{n}}{\sqrt{n}})\) 的,但我没看懂。

  • CF840C On the Bench/P4448 [AHOI2018初中组] 球球的排列

对于 \(a_i=\prod p_k^{e_k}\),记 \(b_i=\prod p_k^{e_k\bmod 2}\),问题相当于让 \(b_i\) 相邻不相同。把相同的 b 分成一组,得到 m 组,每组大小记为 \(c_i\)。考虑所有合法与不合法情况,将相同颜色的球合并为一块,设合并后第 i 组分了 \(d_i\) 块​,记 \(D=\sum d_i\)。答案就是 \(\sum_d \prod c_i!\binom{c_i-1}{d_i-1}\times\frac{D!}{\prod d_i!}\)

把不变的提出来,\(f_{i,j}\) 表示前 i 组,总共分了 j 块。转移就是 \(f_{i+1,j+k}\gets f_{i,j}\binom{c_i-1}{k-1}\frac{1}{k!}\),答案为 \(\prod c_i!\sum_D D!f_{n,D}\)。但是你发现这样不对,应该容斥啊,答案应该属 \(\prod c_i!\sum_D (-1)^{n-D}D!f_{n,D}\),复杂度 \(\mathcal{O}(n^2)\)

  • CF1442D Sum

牛的,本来以为是什么凸包状物,结果是结论。注意到没选满的数组不超过 1 个,这个可以调整法证明。比如 \(a,b\) 各选了 \(t_a<c_a,t_b<c_b\) 个,你删 \(a_{t_a}\)\(b_{t_b+1}\) 或删 \(b_{t_b}\)\(a_{t_a+1}\) 一定有一个比当前更优。去掉一个物品的背包是板子啊,直接分治即可。时空复杂度 \(\mathcal{O}(nk\log n)\)

  • CF1295F Good Contest

简单题,感觉最多 *2000,连我都会做。先 reverse,变成严格不降,至于为什么因为我最开始看错题了。离散化,考虑 \(f_{i,j,k}\) 表示前 i 个数,末尾 k 个数都落在第 j 个区间内的方案数,直接转移就行。复杂度 \(\mathcal{O}(n^4)\)。已经能过了,但是你发现这样 dp 完全是没必要的啊,可以类似的设 \(f_{i,j}\) 表示第 i 个数在区间 j,\(g_{i,j}\) 表示第 i 个数在 \(\le j\) 的区间的方案数,f 到 g 就是求前缀和,g 到 f 直接枚举末尾有几个在一个区间内的数即可。复杂度 \(\mathcal{O}(n^3)\)

  • P3643 [APIO2016] 划艇

这不是我们 CF1295F 吗,怎么都火到这里来了?思路差不多,但是这个题可以不选,而且是严格单增。f,g 变成强制钦定 i 这个位置必须选,转移类似,统计答案改一下就行了。

  • C 【0615 A组】反讽

这不是我们 HDU6326 吗,怎么都火到这里来了?还好我没做过捏。

左括号当 +1,右括号当 -1,如果 \(S=\sum C_i<0\),需要在开头加 -S 个左括号,这就转化成 \(S\ge 0\) 了。\(S\ge 0\) 时答案就是 \(S-2\min(0,\sum_{i=1}^kC_i)\),不难剩下的就是 HDU6326 的严格弱化版,所以直接套用原题做法就行:

原题是有若干个怪兽 \((a_i,b_i)\),表示你需要掉 \(a_i\) 点血来击败它,击败后会回 \(b_i\) 点血,攻击顺序限制形如一棵树,求最小初始血量来不被打死。考虑没有顺序限制怎么做,显然我们会先选 \(a_i\le b_i\) 的再选 \(a_i>b_i\) 的的,所以可以分成两类。如果 \(a_i\le b_i\) 我们按 \(a_i\) 从小到大选;如果 \(a_i>b_i\) 你可以倒着看打怪过程,这样就变成 \((b_i,a_i)\),此时应该按 \(b_i\) 从小到大选,所以我们应该按 \(b_i\) 从大到小选。考虑加上顺序限制,这很简单啊,模仿 AGC023F/UVA1205 那样,堆加并查集维护就行。

但是 \(\mathcal{O}(n\log n)\) 过不去 \(n,m=10^6\) 捏,怎么办呢。注意到 \(a,b\le n+m\) 啊,直接开桶维护就行。

  • CF1976F Remove Bridges

这不是我们 CF1615E 吗,怎么都火到这里来了?好水的 *2800 啊。

画下图就会发现原问题等价于选 2k-1 个点,覆盖它们到根的路径上所有边,求最大覆盖数。这不是经典结论吗,直接选前 2k-1 长的长链即可。

  • CF1110F Nearest Leaf

这不是我们点分治吗,怎么都火到这里来了?暴躁老哥不想观察性质,直接离线点分治即可,\(\mathcal{O}(n\log^2 n)\) 4s 随便过。最开始写的时候唐完了直接点分树的,结果卡卡空间也过了()

其实 1log 做法也很简单啊,发现保证编号就是 dfs 序,离线下来 dfs,维护当前点到每个点的距离。发现进入一颗子树只需要区间加,然后就 1log 了。

  • CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths

好抽象的背景啊,感觉还是比较简单的 *2900 啊。

一眼启发式合并,但是最开始蠢了,还用了 multiset,复杂度就变成 \(\mathcal{O}(22n\log^2 n)\) 了。但是你发现启发式合并的时候清空是全清空,直接用桶就行,少个 log。

  • CF995F Cowmpany Cowmpensation

吐了,怎么这么典的题都做不来了,必须狠狠加训了。

朴素 dp \(\mathcal{O}(nD)\) 很简单,考虑优化。一个想法是如果能求出 \(g_{i}\) 表示恰好只用了 i 种颜色的方案数,答案就是 \(\sum\binom{d}{i}g_i\) 了。做的时候一直在想类二项式反演状物,但是你发现这个可以直接容斥啊。

比如 \(f_{i,j}\) 表示 i 子树内 i 这个点选 j 的方案数,显然 \(g_1=f_{1,1}\),考虑从 \(f_{1,i}\)\(g_{i}\) 怎么做。发现我们只保证了 1 选的是 i,所以 \(g_{i}=f_{1,i}-\sum_{j=1}^{i-1}\binom{i-1}{j-1}g_j\)。系数因为你钦定了 i 必须选,所以 i 占了 j 种颜色中的一种了。或者也可以发现 \(g_{i}=(\sum_{j=1}^i f_{1,j})-(\sum_{j=1}^{i-1}\binom{i}{j}g_j)\),本质是一样的。复杂度 \(\mathcal{O}(n\min(n,D))\)

  • CF418D Big Problems for Organizers

看错题了,蚌。当 \(d_u\ge d_v\) 时,考虑 u 的 \(\lfloor\text{dist}(u,v)/2\rfloor\) 级祖先 p,发现有且仅有 p 子树内的点到 u 的距离一定严格小于到 v 的距离,问题就变成求一个区间内所有点到给定点距离最大值,线段树维护 dfs 序区间直径即可。

  • CF407E k-d-sequence

水题,不如这场 D。特判 d=0,考虑极长的一段膜 d 同余的 a,问题可以转化成给你一个序列,让你找一个最长的区间 [l,r],使得区间内没有重复的数,且 \((\max-\min+1)-(r-l+1)\le k\)。这不是典吗,单调栈线段树秒了。复杂度大概是 \(\mathcal{O}(n\log^2 n)\),但是题解都说这是 \(\mathcal{O}(n\log n)\) 的,不懂。

  • hdu6873 box

唐。平衡树维护,每次操作考虑找到 x 左边第一个高度 <y 的位置 z,发现这个推的操作相当于把 z 后面一个超过 y-1 的高度补到 z 上,然后把 z 后面那个删掉,最后在 x 后面插一个 y-1,平衡树维护即可。特判一下 z x 相邻的情况。

  • P4899 [IOI2018] werewolf 狼人

这不是唐题?怎么想那么久的。原问题就是问你能不能走 \(s\to p\to e\),其中 \(s\to p\) 只能走编号 \(\ge l\) 的点,\(p\to e\) 只能走编号 \(\le r\) 的点。考虑类 kruskal 重构树状物,发现 s 和 e 能到的点分别是两棵树上的一个子树内的点,现在问你是否有交。把一棵树上的 dfs 序当成点权挂到另一棵树上主席树即可。

  • CF407D Largest Submatrix 3

唐到自己了。怎么这都不会做?怎么这都不会做?怎么这都不会做?怎么这都不会做?怎么这都不会做?怎么这都不会做?怎么这都不会做?怎么这都不会做?怎么这都不会做?

考虑 \(f_{i,j,k}\) 表示上、下、右端点分别为 i,j,k 时左端点最小是多少。发现如果你从小到大枚举 k 的话这个就很好维护啊,\(f_{i,j,k}=\max(f_{i,j,k-1},f_{i+1,j,k},f_{i,j-1,k})\)。但是这样会算漏 \(a_{i,k}\) 与第 j 行间的限制和 \(a_{j,k}\) 与第 i 行间的限制,这个直接维护 \(p_{i,c}\) 表示右端点为 k 时第 i 行数 c 最后一次出现位置就行了,注意 p 不能开 int。时空复杂度 \(\mathcal{O}(n^3)\)

  • B 【0507 B组】数字

\(g=\gcd(x,y)\),答案就是 g 去掉所有小于 \(\max(f(x/g),f(y/g))\) 的质因子,其中 f(x) 表示 x 的最大质因子。令 \(x\gets x/g,y\gets y/g\),可以分两种做法:当 \(g\le 1000\) 的时候发现如果 f(x) 或者 f(y) 大于 g 的最大质因子,那 g 就要变成 1 了,所以只需要枚举小于 g 最大质因子的质数去除 x,y;否则说明 \(x,y\le 10^6\),可以线性筛预处理每个数的最小质因子来 log 分解质因数。

  • C 【0507 B组】旅行

考虑点分治,复杂度 \(\mathcal{O}(n\log^2 n)\)。听说可以做到 \(\mathcal{O}(n\log n)\),但我不会。注意在这道题数据下,直接用上一次的 siz 做子树大小的写法比另一种写法常数小一些啊。

  • P1399 [NOI2013] 快餐店

唐唐唐,怎么这都想不到?发现因为一条边一定是用不到的,答案相当于断一条边变成一棵树后直径的最小值的一半,这个随便线段树维护一下就行了。

  • B 【0622A组】数据结构

考虑按 y 分治。注意到只有当前 [l,mid] 内最大的红球,和 [mid+1,r] 内最大的蓝球至少被取到一个时才可能成为最优解,所以有用点对数只有 \(\mathcal{O}(n\log n)\) 级别,询问二维数点即可,复杂度 \(\mathcal{O}(n\log^2 n+q\log n)\)。为什么 \(\mathcal{O}(q\sqrt{n})\)\(\mathcal{O}(n\log^2 n+q\log n)\) 慢这么多?

  • P2305 [NOI2014] 购票

考虑没有 \(l_i\) 限制的时候怎么做,这不就是我们斜率优化吗,直接秒了。加上这个限制后发现它不是单调的啊,很难搞。可以树剖然后套链上 cdq 的做法,复杂度 \(\mathcal{O}(n\log^3 n)\);可以神秘点分治,复杂度 \(\mathcal{O}(n\log^2 n)\)

但是这些都不是重点,考虑一个很巧妙的做法。对于点 u,我们找到它最远的满足 \(d_u-d_v\le l_u\) 的祖先 v。注意到,在这棵树的 dfs 出栈序上,这两个点对应的区间内所有当前有值的点都是在这两点路径上的点,所以每次区间查就行了,复杂度 \(\mathcal{O}(n\log^2 n)\)

  • P8170 [eJOI2021] Waterfront

感觉不止蓝啊。错误的做法都不写了,直接进入正题。

考虑直接让每棵树变成最终高度,然后从高到低砍。但是这样问题在于,有些树在有些日期是砍不了的。比如有很多长得很慢的树同时在最后一天达到 x,显然一天是砍不过来的。注意到先砍是可以改成后砍的,所以我们可以计算这棵树当前至少在第 d 天后才能被砍,然后找到 d 天及其以后第一天有空的时候来砍。前半部分 d 可以通过维护已经被砍了几次来直接计算,后半部分可以用并查集维护。

如果直接用堆维护已经可以做到 \(\mathcal{O}(mk\log n)\) 了,但是还可以更优。考虑把 n 棵树分成被砍过和没被砍过两类,注意到如果我要砍一棵树一定会砍到它不是最大值位置,所以前者可以用队列维护,后者可以提前排序,每次取出两类中最高的,砍一次丢到队列末尾即可实现同样的效果。复杂度 \(\mathcal{O}(n\log n+mk)\)

  • P7738 [NOI2021] 量子通信

这是简单题?这是简单题?这是简单题?这是简单题?这是简单题?这是简单题?这是简单题?这是简单题?这是简单题?有点刻晴了。有点刻晴了。有点刻晴了。有点刻晴了。有点刻晴了。有点刻晴了。有点刻晴了。有点刻晴了。有点刻晴了。

拿到手直接“这也是可做题?.jpg",考虑大力观察一下这玩意的奇怪之处:16,256,最重要的是 \(0\le k\le 15\),所以有这样一个神秘的想法:考虑把这些 256 位的串分成 16 个长为 16 的组,因为 \(k\le 15\),所以符合条件的串一定有至少一组与询问串对应相等。由于字典是随机生成的,所以枚举哪一组相同,期望只用检查 \(\lceil\dfrac{n}{2^{16}}\rceil=7\) 个单词,复杂度大概是 \(\mathcal{O}(256(n+m)+m(\dfrac{16n}{2^{16}}\cdot\dfrac{256}{w}))\),其中 w 是不超过 64 的任意整数。

  • P8292 [省选联考 2022] 卡牌

唉,唐题做一天。

一个自然的想法是子集反演,即枚举没被选的因子集合,没有这里面因子的数随便选。但是 \(a_i\le 2000\),怎么办?如果做过寿司晚宴应该很容易就能想到一个数最多有 1 个大于 \(\sqrt{2000}\) 的质因子,我们把这样的质因子叫做大因子,其余 14 个叫小因子。容易发现每种大因子间没有影响随便做做就完了。

  • P5470 [NOI2019] 序列

最唐的一集。

先建出一个费用流状物。连 \((S,i,1,a_i),(i,i+n,1,0),(i+n,T,1,b_i)\),然后至少 l 对相同变成至多 k-l 个不匹配,于是新建两个点 p,q,连 \((i,p,1,0),(p,q,k-l,0),(q,i+n,1,0)\),跑最大费用最大流即可。手玩感受一下找增广路的过程可以发现只会有五种情况:

  • \(S\to i\to i+n\to T\),对应加入 \((a_i,b_i)\)

  • \(S\to i\to p\to q\to j+n\to T\),对应加入 \((a_i,b_j)\)

  • \(S\to i\to i+n\to q\to p\to j\to j+n\to T\),对应已经有 \((a_i,b_j)\),改成 \((a_i,b_i),(a_j,b_j)\)

  • \(S\to i\to p\to j\to j+n\to T\),对应已经有 \((a_i,b_j)\),改成 \((a_i,b_i),(a_k,b_j)\)

  • \(S\to i\to i+n\to q\to j+n\to T\),对应已经有 \((a_i,b_j)\),改成 \((a_j,b_j),(a_i,b_k)\)

开五个优先队列维护 \(a_i,b_i\) 都未出现的 \(a_i\)\(a_i,b_i\) 都未出现的 \(b_i\)\(a_i,b_i\) 都未出现的 \(a_i+b_i\)\(a_i\) 已出现,\(b_i\) 未出现的 \(b_i\)\(b_i\) 已出现,\(a_i\) 未出现的 \(a_i\),随便写写就过了。复杂度 \(\mathcal{O}(n\log n)\)

  • P2046 [NOI2010] 海拔

今天状态烂透了。

容易发现每个点高度一定是 0/1,且分别形成左上角一个、右下角一个的连通块。于是这个问题等于有向图最小割,直接跑 dinic 可以获得 80。

发现这是一张平面图,这不是我们狼抓兔子吗?直接平面图转对偶图跑最短路即可。详见 link1link2

  • C 【0629 A组】美丽魔法

赛时终于会做 1-eps 道题了。

考虑枚举 \(i\neq j\),显然 i,j 位置上都得是 \(\gcd(i,j)\) 的倍数,考虑维护 \(t_i\) 表示这些限制 lcm。容易发现只有当 \(x=p^c,2x>n\)\(t_x\)\(p^{c-1}\),其余的都有 \(t_x=x\)。怎么用这个算答案呢?发现这其实就是重要条件啊,对答案就是 \(\prod_{i=1}^n((\sum[t_j=i])!)\)。注意到 \(c\ge 2\)\(p\le\sqrt{n}\),可以直接搞,剩下的相当于区间求质数个数,可以 P7884 【模板】Meissel-Lehmer,也可以分段打表。

  • CF997E Good Subsegments

套路的,好区间就是 \((\max-\min)-(r-l)=0\) 的区间,离线,因为这是一个排列,所以 \((\max-\min)-(r-l)\ge 0\),可以直接维护最小值与最小值出现次数,因为长为 1 的区间一定合法,所以线段树上根的最小值一定是 0。但是你发现我们求的是合法子区间个数,这是一个类历史和状物。具体的,你维护两个 tag 表示区间加的,以及这个最小值能贡献多少次,然后你发现第二个 tag 只会每次在根 +1,所以只在子区间最小值等于当前区间最小值相等时下传第二个 tag 即可。挺抽象的啊,感觉还是看代码好点。

  • AT_joisc2014_i かかし

被自己唐到了。考虑按 x 从小到大排序,然后 cdq 分治。考虑 [l,mid][mid+1,r] 之间的贡献。你发现可能成为左下角的位置一定是 [l,mid] 的 y 的后缀最大值,所以不妨把它们都按 y 从小到大排序,单调栈维护即可。然后枚举右上角,可以用单调栈求出一个合法的左下角的 y 的取值区间,这就做完了。复杂度 \(\mathcal{O}(n\log^2 n)\)

  • P3309 [SDOI2014] 向量集/[ABC244Ex] Linear Maximization

简单题。发现 \(\max(xz+yw)=x\max(z+\frac{y}{x}w)\),这不就是我们斜率优化吗,线段树维护凸包秒了。

  • P8365 [LNOI2022] 吃

怎么这么菜啊?怎么这么菜啊?怎么这么菜啊?怎么这么菜啊?怎么这么菜啊?怎么这么菜啊?怎么这么菜啊?怎么这么菜啊?怎么这么菜啊?怎么这么菜啊?怎么这么菜啊?怎么这么菜啊?怎么这么菜啊?怎么这么菜啊?

注意到,如果存在两个 \(a_i,a_j>1\),它们都选的是加,那要么把 i 改成乘不劣,要么把 j 改成乘不劣,所以对 \(a_i>1\) 的位置最多有一个是加。复杂度 \(\mathcal{O}(n)\)

  • A 【0705 A组】屈服的印迹

唐氏题,我都会做。

注意到前缀都没有非空 border 其实就是第一个字符只出现了一次。冷静思考发现 f(s)=k 很不能求啊,我们求 \(f(s)\ge k\)

  • A 【0706 A组】路径计算

  • B 【0706 A组】魔法

唐得可以啊。怎么就差一点呢?

看到这种值域拍成一段,看上去就很典啊,直接狠狠套套路。如果看成按值域从小到大点亮每个点,考虑第 x 次施法,如果当前 自己和至少一个儿子被点亮 的点数记为 y,则当 x-y=1 时会形成一条直上直下的链;否则一条路径一定是 \(u\to lca(u,v)\to v\) 这种的,考虑 lca 合法需要它父亲没被点亮,而且恰好有两个儿子被点亮。对每个儿子数超过 1 的点 u 记 \(l_u\) 表示 \(p_u\) 与儿子中 p 的次小值的 max,则可能成为 lca 的只有 \(l_u\) 最小的 u。这些都可以用 set/可删堆简单维护,复杂度较大常数 \(\mathcal{O}(n\log n)\)

  • B 【0708 A组】树上计数

原:牛客挑战赛70 maimai。

赛时我诗人握持。沙比提啊,怎么有人这都不会呢?而且为什么 w=5,n=200 能出 \(\mathcal{O}(2^wn^4)\) 呢?

直接容斥,狠狠容斥!考虑 \(2^w\) 枚举颜色的子集,强制钦定最后所有被覆盖过的边都不是其中的颜色。然后你发现这样还是不好算恰好删了 i 条边的方案数,考虑狠狠容斥!直接二项式反演,恰好变至少,这样断边之后每个联通块内就可以任意匹配了。设 \(f_{u,i,j}\) 表示 u 子树内断了 i 条边(不算必须断的)当前 u 所在联通块大小为 j 的方案数。转移是简单的,复杂度小常数 \(\mathcal{O}(2^wn^4)\),好像可以插值优化成 \(\mathcal{O}(2^wn^3)\)

  • B 【0710 A组】石堆分裂

牛牛题。考虑如果我们把 0 颗石子也算一堆的话,如果我们二分答案为 mid,相当于把 n 颗石子拆 mid 层,每颗石子的贡献机会可以从根到叶看成一个长为 mid 的二进制串,现在问题相当于找 n 个互不相同的二进制串,满足每个位置是 1 的次数都不超过 m。注意到这个其实和 1 的个数之和不超过 m*mid 是等价的。必要性显然,充分可以调整证一下。比如我们按 1 的个数从小到大选,随便构造一组解,如果每个位置 1 的个数的极差 <=1 就可以了。如果当前极差 >1,考虑 i 位是 1 最多的,j 位是 1 最少的,那么一定存在一个串满足第 i 位为 1,第 j 位为 0,且不存在与其恰好只有这两位不同的串,把这个串交换第 i,j 位即可。一直调整下去即可让极差 <=1。由于组合数增长很快,所以复杂度其实很小。

  • P7211 [JOISC2020] カメレオンの恋

感觉思维含量有点高了,就是这玩意真的算大码量练习题?

考虑 n^2 的时候怎么做的。我们枚举 i<j,如果 Query({i,j})=1 说明 i,j 要么有单向喜欢关系,要么颜色相同。考虑给所有结果是 1 的点对连边,这样每个点度数都是 1 或 3。如果一个点度数为 1,说明跟它相连的那个点一定是和它颜色相同的点;否则和它相连还有它喜欢的和喜欢它的,

posted @ 2025-09-14 01:54  xx019  阅读(0)  评论(0)    收藏  举报