AFO时间过长致使看什么都以为新鲜……暑假训练主要就是打一打hdu和nowcoder的多校,题目没什么好保密的。由于没有部分分可能并不适合学弟学妹们练习,不过有些idea仍是颇有意思的,看成课余消遣大约不错。思惟能力很强的oier想必头脑中都有不少妙不可言的模型吧?没有用公式题解果真不美观qwqphp
7.22 算法
简要题意:给定一棵树,每次选两个叶子,给它们之间的路径上的边加任意实数权。如今假设这棵树每一个边都有一个随机边权,问按上述规则是否存在构造方案。要求线性复杂度。数组
简要题解:度为 2 的点所连的两边必须相同,因此判度数便可。对于其余状况都可在子树中调整,充分性一样可证。bash
CF1189 A2 Add on a Tree:Revolutionide
简要题意:把前一题中的实数权改成正整数,规定每条边的边权,给出一个构造方案。要求线性复杂度。优化
简要题解:按照 dfs 序构造,关键在于怎样消除上面操做对已经完成部分的影响。将一个叶子节点设为根,其余叶子节点直接向根连要求权值的边。对于非叶子节点,选取子树中两个叶子之间连(出权-入权)/2,再由两个叶子分别向根连边,便可知足当前要求而且不破坏以前构造。过程当中出现了小数或上一题中矛盾即为无解,算法题每每把一个总体问题“分步处理”,尽量消除后效性才能够获得满意的复杂度。idea
7.25 2019牛客多校3spa
G Removing Stonescode
简要题意:有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个元素,可是要求的初始内存较大。可使用邻接表,达到空间线性。