退役之后一直想着,我至少还是更新一下 ucup 好题和互测好题,但很遗憾一直摆到了现在;论文也还没有开始施工。
我一直觉得自己如果改掉不良的生活习惯,提高自己的学习效率,完全可以达到更高的水平,但很遗憾我确实战胜不了自己,我或许永远都看不到自己的上限了。
马上就 NOIP/CTT 了。我觉得我起码得象征性的训练一下。我仔细想了想,我还有一个上 LGM 的梦;我是 ucup 队里最菜的人,我不想继续次次在后期摆烂。
那趁我清醒,开始写点东西吧。
先写下没打但是想做的:stage4,stage8
2J. Polygon II
有 \(n\) 个在 \([0,2^{a_i}]\) 随机的实数,求它们能围成多边形的概率。\(n\le 1000\) 。
算不合法的概率,那就是枚举最大的边 \(p\),要求 \(\sum x\le 2x_p\) 。改变一下 \(x_p\) 的定义,重新令其为 \(2^{a_p}-x_p\) ,这样就得到 \(\sum x\le 2^{a_p}\) 了。
接下来是关键的一步: 由于我们只关心 \(\sum x\) 和一个整数的大小关系,那其实可以把 \(x\) 拆成整数部分和小数部分。也就是如果指定 \(x\) 的整数部分,令 \(A=2^{a_p}-\sum [x]\) ,那合法的概率其实就是 \(n\) 个 \([0,1]\) 间随机的实数加起来 \(\le A\) 的概率,这可以容斥计算。
问题转化成:计算 \(A\geq 0,A\geq 1,A\geq 2,\dots,A\geq n\) 的概率。
现在 \([x_i]\) 是 \([0,2^{a_i})\) 随机的整数,发现我们可以进一步拆解:可以看成二进制下每一位都有 \(\frac{1}{2}\) 的概率为 \(1\) 。最后的计算就是数位 dp 状物了,从低到高 dp ,记录下当前 \(\sum x\) 和限制的大小关系,以及往后的进位。复杂度大概是 \(O(n^4\log V)\) 。
怎么优化呢,由于我们最后只需要计算 \(\sum e_iP(i+\sum [x]\le 2^{a_p})\) 状物,我们在 dp 的时候只需要在最低位先垫上 \(i+1\) ,最后看第 \(a_p\) 位有没有进位即可,于是也不需要记与限制的大小关系,答案就是 \(dp_{a_p,0}\) ;又可以发现并不需要枚举 \(p\) ,所以复杂度降为 \(O(n^2\log V)\) 。
2L. Chords
一个环上 \(2n\) 个点连了 \(n\) 条边,要取出尽量的边满足两两不交,数据随机。
\(n\le 10^5\)
先编出来 \(O(n^2)\) 的 dp ,就是设 \(dp_{i,j}\) 为 \([i,j]\) 内能取多少线段。发现由于数据随机,答案是 \(O(\sqrt{n})\) 级别的,于是经典的交换状态和值域,设 \(p_{j,k}\) 是令 \(dp_{i,j}\geq k\) 的最大的 \(i\) ,发现 \(p\) 也是好算的,复杂度 \(O(n\sqrt{n})\) 。
2I. Mercenaries
有 \(n\) 个点, \(i\) 和 \(i+1\) 的边上有若干物品,物品有属性 \((x,y)\) ;点 \(i\) 上也有一件物品。现在有若干询问 \(R,a,b,c\) ,你想求出最大的 \(L\) 使得:能从点 \(L\) 到点 \(R\) ,使得取出点 \(L\) 的物品,再在路上每条边取一件物品,能使得 \(a(\sum x)+b(\sum y)\geq c\) 。
\(n,q\le 2*10^5\) ,物品总个数 \(S\le 5*10^5\) 。
可以发现这个问题一看就很凸包。
建出线段树,设 \(G_p\) 是节点 \(p\) 内每条边取一个物品得到的 \((\sum x,\sum y)\) 形成的上凸包;\(F_p\) 是节点 \(p\) 内取一个点为起点,走到右端点的 \((\sum x,\sum y)\) 构成的凸包。令 \(M\) 是 \(mid\) 到 \(mid+1\) 的物品构成的凸包,发现 \(G_p=G_l*G_r*M\) ;\(F_p=F_l*G_r*M+F_r\) ,其中 \(*\) 是闵可夫斯基和,\(+\) 是求两个点集并起来形成的凸包。查询在线段树上二分即可。
发现每次询问要对 \(O(\log n)\) 个凸包求出,取一个点 \((x,y)\) 使 \(ax+by\) 最大。考虑把询问离线下来,把 \((a,b)\) 按极角排序,然后只用对每个凸包维护一个指针即可。复杂度 \(O((n+q+S)\log n)\) 。
3K. Knocker
这场开始和两个超级传奇大师做队友。
给你一个序列,一次操作能整体模一个数,问最后能得到多少不同的序列。\(n\le 500\)
(记录官方题解)先来分析终止状态 \(b\) 合法的条件。不妨对 \(a\) 从大到小排序并去掉相同的位置,接下来观察 \(b_1\) ,现在不妨设 \(k=b_1-a_1\) ,我们有结论:对于 \(a_i\geq k\) ,\(b_i\) 一定等于 \(a_i-k\) 。
只需要证明一步操作后这个条件成立,然后归纳即可。不妨设模 \(x\) 后得到的分别是 \(a'_1\) 和 \(a'_i\) ,那首先有 \(a_1-a'_1\le k\le a_i\) ,于是 \(a_i-a'_i\geq a_1-a'_1\) 。另一方面由于 \(a_i-a'_i=x[\frac{a_i}{x}]\) 。所以 \(a_1-a'_{1}\geq a_i-a'_i\) 。就发现 \(a_1-a'_1=a_i-a'_i\) 了。
回到问题,这里还有一个条件:\(a_i<2k\) ,一步有效操作后 \(a_1\) 一定会减半。发现这之后直接取模数为 \(k\) ,即可让 \(a_i\geq k\) 的数都变成 \(b_i\) 了;这也是最优的方法,因为取更小的数后效性更大,取更大的不合法。你发现这样就不会影响 \(a_i<k\) 的那些数,于是此时递归到了一个子问题!只不过我们为了不再影响已经固定了的这些数,会要求之后每次取的模数 \(> b_1\) 。
于是设 \(dp_{i,j}\) 表示只使用 \(\geq j\) 的模数能得到的不同 \(b_i\) 到 \(b_n\) 个数,转移枚举 \(k\) 即可。复杂度 \(O(n^3)\) 。
3B. Breaking Bad
给你一个 \(n*n\) 的矩阵,对于 \(k=0,1,\dots,4\) ,问是否存在排列 \(p\) 使得 \((\sum A_{i,p_i})\bmod 5=k\) ,\(n\le 1000\) 。
首先可以想到随机赋权算行列式,可惜过不了。
(记录官方题解)
观察到大多数情况下每个 \(k\) 都是有解的。考虑如果有一个排列满足能取出不交的四对数 \((i,j)\) ,都满足 \(a_{i,p_i}+a_{j,p_j}\neq a_{i,p_j}+a_{j,p_i}\) (模 \(5\) 意义下)那就可以通过交换/不交换 \(i,j\) ,对排列进行调整,不难发现一定能调整出所有可能的余数。
(其实有一个数学上的结论是,对于 \(k\) 个模 \(p\) 非 \(0\) 的数 \((k<p)\) ,它们不同的子集和一定有至少 \(k+1\) 个。)
接下来先找到任意一对这样的 \((i,p_i),(j,p_j)\) 。事实上去尝试 \((i,j),(i+1,j+1)\) 就好了,反证易得。如果找不到的话也不难说明此时排列怎么取,结果都是一样的:一定存在序列 \(R,C\) 使得 \(a_{i,j}=R_i+C_j\) 。
接下来直接把 \(i,i+1\) 行和 \(j,j+1\) 列删掉,继续找下去,如果最终找到了四对我们就 win 了。否则看一下发生了什么,设此时找到了 \(q\) 对,发现我们其实就得到一个 \((n-2q)*(n-2q)\) 的子矩阵,满足 \(a_{i,j}=R_i+C_j\) 。不妨设 \(q=3\) ,把特殊的 \(6\) 行 \(6\) 列提到最前面。接下来直接状压 dp:
\(dp_{i,S,h}\) 表示考虑到第 \(i\) 行,关键列取了 \(S\) 且当前和为 \(h\) 是否可能。注意这里算和的时候,我们先把和当成 \(\sum R+\sum C\) ,每次取了一个特殊的格子后就把对应的 \(R,C\) 减去,再把实际值加上即可。复杂度即为 \(O(4^mn)\) ,本题中 \(m=5\) 。
感觉这场这两个题都不在我脑洞范围内啊,大概想一想,K 是找到了判定过程中的子问题,从而设计 dp;B 是观察到了难搞的情况形式很好看,于是也不难搞了。
5J. Prefix Divisible by Suffix
问你 \(n\) 以内有多少数满足:把十进制写出来,能够把它划分成两段 \(p,q\) ,使得 \(q+c|p\) ,其中 \(c\) 是给定常数。\(n\le 10^{14},c\le 10^4\) 。
发现自己其实一眼就会了,只是不敢剪枝。考虑直接枚举最低的 \(7\) 位,发现此时我们对 \(n\) 提出来若干限制 \((p,c)\) 表示:若模 \(p\) 余数为 \(c\) 就一定合法了。对这些限制容斥,这样就得到了一个算量 \(20^{7}*\log V\) 的做法。(需要解 CRT)
但自己想想,算量真的会那么大吗?可以发现指定容斥的集合,其模数的 lcm 很有可能很大,于是容斥的时候直接搜索要钦定的集合,lcm 太大了就剪掉。然后就能通过了。。挺没意思的。
5C. Painting Fences
给你一个网格,给出每个格子开始的颜色(黑/白),一次操作可以选一条与 x/y 轴平行的直线对网格翻折,对于重合的两个格子,如果一个为黑的话可以把另一个也染黑。求出使得所有格子变黑的最小次数。\(n\le 1000\)
倒着来看这个过程,于是发现起作用的其实只是一个全黑的子矩形,设 \(f_{l,r}\) 是假设这个矩阵是 \(1*n\) 的,且 \([l,r]\) 为黑那需要操作多少次,\(g_{l,r}\) 同理为矩阵长为 \(m\) 时的次数。则可以发现一个子矩阵需要的操作数就是 \(f_{xl,xr}+g_{yl,yr}\) 。
枚举 \(xl,yl\) 。一个一开始就能做出的观察是答案很小,具体的发现:\(f_{l,r}\) 的大小都是 \(O(\log n)\) 级别的,所以求出 \(p_{l,i}\) 表示最小的 \(r\) 使得 \(f_{l,r}\le i\) ,\(q_{l,i}\) 同理。于是只需要枚举 \(xr=p_{xl,i},yr=q_{xr,j}\) 看看是否合法即可。这里可以双指针,复杂度 \(O(n^2\log n)\) 。
7E. Express Eviction
给你一个 \(n*m\) 的网格图。有一些格子存在障碍,障碍可以 ban 掉它周围的四个顶点。现在你想知道:至少要移除多少障碍,才能从 \((0,0)\) 走到 \((n,m)\)。
先想想如果已经知道哪些点被 ban 了该怎么判断,发现其实就是,如果存在 \(x=0/y=m\) 的点与 \(x=n/y=0\) 可以通过 ban 掉的点八联通起来,那就寄掉了。
进一步可以发现,确定障碍后寄掉的条件其实就是: \(x=1/y=m\) 的某个障碍可以走到 \(x=n/y=1\) 的障碍,其中每一步只能走到 \(x,y\) 之差都不超过 \(2\) 的障碍,证明比较容易。
对着这个做最小割就好了。
7C. Price Combo
很牛的一个题,先咕了。
10H. Intersection of Paths
给定一棵有边权的树,询问:临时修改一条边的边权,然后给定 \(k\) ,求出取 \(k\) 条端点不重合的路径,交的边权和的最大值。\(n,q\le 5*10^5\) 。
取重心为根,发现如果存在一组方案的交会包含 \(u\) 到 \(v\) 的路径,就等价于 \(sz_u,sz_v\geq k\) ,于是如果没有修改边权的事情,我们就只用求出 \(sz\geq k\) 的点中距离最远的两个点。
现在有边权修改,怎么处理,我们其实只需要求出删掉这条修改的边后,两个子树分别的直径即可。注意到这个直径的端点要么是叶子,要么是删掉的边的端点,那我们考虑把 \(k\) 相同的询问放到一起处理,将保留 \(sz\geq k\) 的点后得到的树的叶子拎出来,容易发现它们只会有 \(\frac{n}{k}\) 个,每次询问相当于查一段区间的点的直径,线段树处理就可以平衡。复杂度 \(O((n+q)\log n)\) 。
冷静一下,其实这样处理烦了,我们把询问按 \(k\) 从大到小排序,这样只需要维护线段树,要求每次激活一个点,以及查询一个区间激活的点的直径即可。复杂度仍是 \(O((n+q)\log n)\) 。
LOJ177 生成子群阶数
给你 \(m\) 个长度为 \(n\) 的排列,问你它们能复合出多少不同的置换,其中每个排列都能用若干次。\(n,m\le 50\) 。
发现还不会这个东西,学一下。
首先可以把给定排列的逆也加进来,因为设其环长 lcm 为 \(L\) ,其实逆就可以表示成原来的排列复合 \(L-1\) 次。
考虑建出一张图,对于一个给定的排列,对任意 \(1\le i\le n\) ,我们从 \(i\) 连向 \(p_i\) ,这样一组操作可以看做是从 \(1\) 开始的一条路径,途中会复合上所有经过的置换。可以发现这里走到的点就代表当前 \(p_1\) 的值。
现在先求出以 \(1\) 为根的生成树,设终点为 \(t\) ,那对于 \(1\) 到 \(t\) 的任意一条路径,考虑在走到 \(t\) 之后,沿着树边走回 \(1\) ,再走到 \(t\) ,可以发现这样效果是不变的,于是终点为 \(t\) 的路径一定都形如:从 \(1\) 出发走回了 \(1\) ,再按照树边走向 \(t\) 。
就可以得到一个结论,方案等于:\(p_1\) 可能的取值数 ,乘上 \(p_1=1\) 的方案数。
继续思考对于一条走回 \(1\) 的路径 \(1\rightarrow u_1\rightarrow u_2\dots \rightarrow u_k\rightarrow 1\) ,它和 \(1\rightarrow u_1\rightsquigarrow1\rightsquigarrow u_1\rightarrow u_2\rightsquigarrow 1 \rightsquigarrow u_2\rightarrow u_3 \rightsquigarrow 1\dots \rightarrow u_k\rightarrow 1\) 是等价的。其中 \(\rightsquigarrow\) 是在走树边。
于是得到结论:\(p_1=1\) 的排列都可以通过将 \(1\rightsquigarrow u\rightarrow v \rightsquigarrow 1\) 得到的排列复合得到。
这样做的好处是,我们可以用的置换都满足 \(p_1=1\) ,于是可以递归到 \(n-1\) 的子问题继续做。但问题是我们建出的图有 \(nm\) 条边,也就是说子问题里 \(m:=nm,n:=n-1\) ,这显然就炸掉了。结论是,我们只需要把这 \(nm\) 个置换先改造成 \(O(n)\) 个,改造的方法是,我们进行随机,在这些置换中随机选择一个子集,将内部的置换复合起来,这样随 \(O(n)\) 次,把每次随机得到的置换给递归下去。
复杂度 \(O(n^5)\) ,瓶颈在于要做 \(O(n^2)\) 次随机复合的过程 ,每次期望会复合 \(O(n^2)\) 个排列,单次复合是 \(O(n)\) 的。
11J Again Permutation Problem
只需要把 LOJ177 的答案和 LOJ4127 的答案乘起来就好了。
回顾一下 LOJ4127 的做法,其实发现这里分析的方法是类似的,我们仍然先把排列的逆加进来,然后建立一张 \(n^2\) 个点的图,对于一个给定排列我们在点 \((i,j)\) 和点 \((p_i,p_j)\) 间连边。这样有结论是:若 \((i,j),(a,b)\) 联通则 \(p_i=a,p_j=b\) 的方案数等于 \(p_i=i,p_j=j\) 的方案数。证明是和上面那个题的证明基本一致的。
于是算逆序对的期望只需要枚举 \(i<j\) ,记与 \((i,j)\) 联通的满足 \(a<b\) 的点数为 \(x\) ,\(a>b\) 的点数为 \(y\) ,那贡献其实就是 \(\frac{y}{x+y}\) 了。更直接的,就是对每个联通块计算 \(\frac{xy}{x+y}\) 的和。
11F Train Seats
题意是有一些椅子,每次可以拿走一个椅子,代价是离它最近的两把椅子的坐标差(若左边没有则为 \(0\) ,右边没有则为 \(m+1\)) 。让代价的和最大。\(n\le 2*10^5\) 。
对 \(a\) 排序,设 \(b_i=a_{i+1}-a_i\) (令 \(a_{n+1}=m+1\)),则一次操作相当于合并 \(b_i,b_{i+1}\) ,代价为 \(b_i+b_{i+1}\) ,最后让代价最大。建一棵二叉树来刻画这个过程,然后我们有结论:不可能有一个点的两个儿子都是非叶子。证明就考虑四个数 \(x,y,z,w\) ,我们相当于要证明:先合并 \((x,y),(z,w)\) ,再合并 \((x+y,z+w)\) 一定不优。原因考虑此时代价是 \(2(x+y+z+w)\) ,而从左往右依次合并的代价是 \(3x+3y+2z+w\) , 从右往左是 \(x+2y+3z+3w\) 。把都有的东西减掉,发现 \(\max(2x+y,z+2w)\geq \frac{2x+2w+y+z}{2}\geq x+w\) 。
那其实就可以看到我们只有两种可能:要么合并好 \([2,n]\) 再把 \(1\) 合并进来,或者合并好 \([1,n-1]\) 再把 \(n\) 合并进来。也就是说,每次会删掉 \(b\) 的开头/结尾,代价是当前剩余的长度乘上选择的数。
直接使用 qoj2070 的代码即可。大概思路就是枚举最后保留的位置 \(k\) ,那就是对一棵只有两条链的树做 exchange argument,利用线段树来合并两侧已经出现的连续段即可。
11O New School Term
差点把我们队逮捕了的题。
题意是给你一些边,你希望选择其中一些边,在图是二分图的前提下,使选择的边的 \(\sum 2^{编号}\) 最大。