暑假训练idea汇总
AFO时间过长导致看什么都觉得新鲜……暑假训练主要就是打一打hdu和nowcoder的多校,题目没什么好保密的。因为没有部分分可能并不适合学弟学妹们练习,不过有些idea还是很有意思的,当作课余消遣大约不错。思维能力很强的oier想必头脑中都有很多妙趣横生的模型吧?没有用公式题解果然不美观qwq
7.22
简要题意:给定一棵树,每次选两个叶子,给它们之间的路径上的边加任意实数权。现在假设这棵树每个边都有一个随机边权,问按上述规则是否存在构造方案。要求线性复杂度。
简要题解:度为 2 的点所连的两边必须相同,所以判度数即可。对于其他情况均可在子树中调整,充分性同样可证。
CF1189 A2 Add on a Tree:Revolution
简要题意:把前一题中的实数权改为正整数,规定每条边的边权,给出一个构造方案。要求线性复杂度。
简要题解:按照 dfs 序构造,关键在于怎样消除上面操作对已经完成部分的影响。将一个叶子节点设为根,其他叶子节点直接向根连要求权值的边。对于非叶子节点,选取子树中两个叶子之间连(出权-入权)/2,再由两个叶子分别向根连边,即可满足当前要求并且不破坏之前构造。过程中出现了小数或上一题中矛盾即为无解,算法题往往把一个整体问题“分步处理”,尽可能消除后效性才可以得到满意的复杂度。
7.25 2019牛客多校3
G Removing Stones
简要题意:有n堆石子,每个堆有ai个,每次取石子要从两个不同堆各取一个,问有多少区间可以按这个规则取完所有石子,n<=3e5。
简要题解:可以看出题目要求等价于 sum>=2*max,找出区间中最大值,从短的一侧枚举端点,在另一侧二分更新答案,然后从最大值两侧向下分治。每一次枚举的端点数不超过 1/2,这一步复杂度上限为 log,总复杂度nlog^2。
7.27 2019牛客多校4
I .string
简要题意:求有多少本质不同的子串,但是a与rev(a)只统计一遍,要求线性复杂度。
简要题解:用后缀自动机可以求本质不同子串个数,一个非回文子串在 s 和 rev(s)中会被记录两次,但是回文串只有一次。所以正反串中本质不同子串个数 p+回文子串个数 q,每个串都被记录两遍,/2 即得到答案。注意把反串加入后缀自动机时要和正串分隔开,中间分隔符对答案的影响要消除。
D .triples I
简要题意:求至少多少3的倍数可以或运算得到给定的数s,输出方案。
简要题解:从表面上观察 01 的形态并不是有效的方法,想到一个二进制位模 3 非 1 即 2, 可以根据给出数字模 3 的余数和中间某些位模 3 的余数来构造合法解,最多只会用到两个数。
7.29 2019HDU多校3
简要题意:一个长为n的序列ai,每次取一个不下降子序列,取k次。每个元素不能被重复选取,问选取元素的和最大是多少。n<=2000,k<=10.
简要题解:可以利用费用流,对源点和序列中每一个点拆点限制流量,源点的出点向每个点入点连边,每个点出点向汇点连边。暴力建图中由 i 的出点向后方所有权值更大的入点连边,为了优化建边给每个点拆出的两点之间增加一个费用为 0 流量为 inf,则一个不减的序列可以自然连接,需要再建的只有权值比之前连过的点都小、但不小于 i 的点。
8.1 2019牛客多校5
E.independent set 1
简要题意:N 个点的图,求每一个导出子图的最大独立集,n<=26。
简要题解:状压DP,将每个点相连的点也用二进制表示。去掉最高位的1来转移, f[i]=max(f[ibin[j]],f[(i-bin[j])&(~e[j])]+1)。时间空间复杂度都是 2^n,用 1 字节的 char 来压内存。
F.maximum clique 1
简要题意: N 个点的图,每两个权值至少有两个二进制位不同的点之间有边,求最大团并输出方案, n<=5000。
简要题解:最大团等于补图的最大独立集,二分图最大独立集=总点数-最小点覆盖。本题中补图有边相连的条件是只有一个二进制位不同,则同一点连向的两个点一定有两个二进制位不同,不会有边相连,染色后就可转化为二分图。
输出最大独立集的方案是这道题的亮点。要在匈牙利算法结束后选择左侧未匹配点重复尝试匹配,因为图中已不存在增广路,尝试一定会失败于一条匹配边,并且是未匹配-匹配边交错。标记这 个过程中遇到的点,选取左侧有标记的点和右侧无标记的点即为最大独立集,其余点为最小点覆盖。
8.3 2019牛客多校6
I.Can They Go to Galar?
简要题意:给出一个仙人掌,1号点有精灵,边有边权 p。一个已有精灵的点有 p 的概率使与它相连的点出现精灵,问最后期望精灵数。
简要题解:用圆方树处理仙人掌是常规操作,但是因为很久没写过圆方树,开这道题的时间也非常晚,没能 AC。从 1 开始 dfs,一个环中一定有一个点先被到达,称之为起 点,那么从起点到达这个环中的其他点的概率为 1-(1-左侧到达概率 p)*(1右侧到达概率 q)。 由于建树时按 dfs 序求点双,一个方点连接周围圆点的顺序也是 dfs 序,按顺序取出圆点最后一个恰是起点,故概率 p 和 q 可以用前缀/后缀积快速计算。被到达的概率*起点答案即为环中每个点答案,对于非环中点直接用起点*边权求解。
8.5 2019HDU多校5
2. 6625 three arrays
简要题意:给出两个数组 a、b,c[i]=a[i]^b[i],可随意调整 a、b 中数字顺序,求字典序最小的 c 数组。
简要题解:本题容易联想到 trie 树,但如果没有一些必要结论,贪心的正确性很难凭空理解。
我们把 a[i]在 b 数组剩余所有数中和 b[j]异或最小称作a[i]选择 b[j],那么 a[i]b[j]若互相选择则一定为最优解。a[i]选择 b[j],而 b[j]选择a[k]体现了不等关系 a[k]^b[j]<a[i]^b[j]。若不断地寻找最优,结尾一定是两个数相互选择——因为数字个数有限必定出环,环的大小不等于 2 则可沿不等关系推出 a[i]^b[j]>a[i]^b[j] 的矛盾。按照这种思路模拟,复杂度为 nlogv,trie 树中查找最优复杂度为 logv, 每次查找或者出环消除两个点,或者在队列中新加一个点,次数都为 N。
但是贪心的编程复杂度远低于上述解法,只需要每次在 trie 树中找尽量近的两点并删去。我们假设在 trie 树中找到了最近的 a[i]、 b[j],若 a[i]没有选择 b[j], 说明有更近的 b[k],与最近矛盾;同理 b[j]也会选择 a[i]。因为在 trie 树中找的是每个分支最近的两个叶子,而不是像上一个算法一样固定一个去找另一个,所以它们一定互相选择。在每个值最小后只需要排序就能得到最小字典序,仅仅凭这个输出要求就推断逐个确定的思路是不可取的。
8.7
G. What Goes Up Must Come Down
简要题意:要把一个长度<=10^5 的序列通过 swap 调整为先单调不减再单调不增,问最小操作次数。
简要题解:我们可以先考虑最小的一个数,因为任何其他数都不会越过它到达两端。直接看这个数到哪一端逆序对数较小并选择,因为这是最小数它并不会影响其他数的逆序对数。把最小数移到一端之后就变成了一个子问题,继续取第二小数即可。对于这个算法来说相等的数没有影响,先取任意一个都是一样的。
8.8 2019牛客多校7
B. Irreducible Polunomial
简要题意:给出一个 n 次多项式的系数,判断它是否能在实数域内因式分解。
简要题解:一个 n 次多项式有 n 个复数根,两两成对,任取一对相乘即可得到一个实数因式,因此三次及以上一定可以因式分解,而一次及以下一定不可以。二次能否因式分解要看德尔塔,若 b^2<4ac 则不能因式分解。
F. Energy stones
简要题意:有 N 个石头,每个初值为 ei,每秒增加 li,最高到达 ci。有 M 次询问,每次获得 ti 时间后一个区间[li,ri]的值之和,并且将这个区间的值置为 0,问所有询问获得的价值之和,n,m<=1e5。
简要题解:注意到我们关注的是相邻两次询问的时间差,那么一次询问可以看成一个差分, 在 li 加入此次询问,再在 ri+1 删除。用一个 set 维护当前询问,再用树状数组维护相邻两询问的差。每块石头对答案的贡献可以分成前后两部分,即已经长到 ci 和还未长到 ci 的询问差数,已经长到就用个数*ci,还未长到就用时间*li。注意第一次询问要特殊处理,考虑 ei 的贡献。
8.10 2019牛客多校8
A.All-one Matrices
简要题意:给出一个长宽不超过3000的01矩阵,问最大全1矩形数。最大矩形即不被其他矩形包含的矩形。
简要题解:预处理每个点向上延伸的连续1的个数和、向左延伸的l,然后扫每个点,对每一行h维护一个单调递增的单调栈,每个栈中元素记录向左延伸长度。当我们弹栈说明右侧有一个不大于它的数,若这个数比它小,左、右、上三方都不能再延伸,只要用l判断一下下方也不可延伸就可以贡献答案了。
I. Inner World
简要题意:开始有n棵只有1个点的树,m个连边操作,在区间[l.r]的u端点下连上v,保证v各不相同。之后有q个询问,每次问区间[l,r]的x点子树大小之和,n、m、q<=3e5。
简要题解:因为v各不相同,我们可以建一棵树,记录每个点出现的区间。以dfs序为x坐标,出现区间为y坐标,每次询问相当于询问一个矩形的值。我们建一个大小为n的线段树,依次扫描dfs序上每个点,把它出现的区间+1。离线询问,一个询问可以化为点x的dfs序中out处[l,r]-in-1处[l.r]的值。
8.14 2019HDU多校8
简要题意:给一张n个点的图,求长度为k的点不重复最长路,n<=1e4,2<=k<=6。
简要题解:正解用了一个有趣的随机化思想。随机给点染上k种颜色,容易用状压dp求得包含k种颜色的最长路。如何保证原图中最长路上的k个点恰好被染成不同颜色呢?多随机几次,每次正确的概率为k!/k^k,因为k很小,时间可以承受。
简要题意:给出两个边与坐标轴平行的矩形,问它们把平面分成几部分。
简要题解:离散化之后并查集。
8.15 2019牛客多校9
J.Symmetrical Painting
简要题意:一个白色平面内有n个黑色矩形,现在将任意部分染成白色,使余下黑色部分有一条与x轴平行的对称轴,求黑色部分最大面积。n<=3e5.
简要题解:将y坐标全部乘2,面积问题就变成了距离问题。
先证明最后答案一定为一个现有矩形的对称轴:将对称轴向上平移,一部分矩形对答案贡献变大,一部分变小;贡献由变大到变小当且仅当总体对称轴穿过该矩形对称轴时,所以最佳决策点一定在某个矩形对称轴处。
之后做法比较简单,从下到上移动对称轴,预处理每个矩形开始贡献答案、对答案贡献由变大到变小、结束贡献答案的对称轴。对于每个对称轴,未变化的矩形对答案的贡献可以直接计算,发生变化的分别处理。每个矩形最多被特殊处理3次,时间复杂度为线性。
注意vector里虽然只有3n个元素,但是要求的初始内存较大。可以使用邻接表,达到空间线性。