CF1422F Boring Queries
OMA 推荐的好题,挺早之前就想要做了,昨天晚上看了看题解,今早上(7:26) 就过了。。
对于最小公倍数可能想的就是维护区间乘积以及 GCD ,然而这是不对的,反例也很好出来 2,2,4
。
然后就有了第二个错误的做法,先求出来两个数字的 LCM 然后对于新加入的数字再求一遍,显然是不对的,因为取模破坏掉了某些本来存在的因数。。
有根号分治的做法,但是不会,于是学习了主席树做法。
先考虑离线做法,对于固定的右端点,从右往左扫左端点,一个数字的质因数的若干次幂 \(p^k\) 如果之前出现过 \(p^i\) ,那么只有在 \(k>i\) 的时候 LCM 才会多出来 \(p^{k-i}\) 的贡献。
再想一想在线我们可以对于每一个右端点开一个主席树,然后贡献就是按照上面所说的去做,对于左端点多余的贡献直接记录 \(p^i\) 上一次出现的位置,然后单点修改就好了。
查询直接区间查询。。(code)
P7925 「EVOI-RD2」童年
这个就是不知道啥时候在 Luogu 某次比赛上面找到的题了,没啥算法,但是感觉不错。
\(f_i\) 表示遍历 \(i\) 的子树需要的最少的苹果数,对于一个根节点,可以用优先队列优先进入一个需求少的子树,然后不断更新答案。
最后同样 BFS 一遍利用 f 数组,也是优先队列贪心的选择花费较小的节点遍历。(code)
P2685 [TJOI2012]桥
同样是 OMA 推荐的题目,线段树+最短路。
显然的,Boss 一定会在 1 到 n 的最短路上面,那么我们先跑出来 1 以及 n 的单源最短路,同时记录前驱,这样我们就可以挨个跳回去找到 1 到 n 的最短路上的点了。
然后利用最短路径上的点更新其他点的 \(1\rightarrow n\) 与 \(1\rightarrow x\) 最短路径上最远的重合的点以及 \(n\rightarrow 1\) 与 \(n\rightarrow x\) 最短路径上最远的重合的点,分别记为 \(l_i,r_i\)
对于一条边 \((u,v)\) 可能处于最短路径上的情况当且仅当 \([l_u,r_v]\) 上面的边断掉,那么我们直接给这个区间的可能值与 \(dis1_u+val_{(u,v)}+disn_v\) 取较大值最后统计答案。(code)
P4492 [HAOI2018]苹果树
不知道在任清单里面放了多少年的一个计数题了。
第一思路肯定是统计条边可能的贡献,以 i 为根节点子树大小为 j 的贡献就是 \(方案数\times j\times(n-j)\)
问题就变成了求方案数,我们可以把方案数分为三部分:
-
编号在 i 之前的:由于是一颗二叉树,因此方案数就是 \(i!\) 。
-
在 i 子树中的:首先是选择编号也就是 \(\binom{n-i}{j-1}\) 然后排布的方案数也类似与上面就是 \(j!\) 总体方案数就是 \(\binom{n-i}{j-1}\times (j!)\)
-
编号在 i 之后但是不在 i 的子树中的: 再新加入一个点的方案数为 \(i−1\),加入第二点的方案数为 \(i\),加入第二点的方案数为 \(i+1\) ,一直加到最后一个点,总方案数就是 \(\dfrac{(n-j-1)!}{(i-2)!}\)
答案的柿子就是:
直接 \(n^2\) 推即可。(code)
CF1575M Managing Telephone Poles
这个就是题单上面的题目了,是个斜率优化,直接四个方向分别做一边就好了。
设 \(las_k\) 表示前 \(i\) 行,第 \(k\) 列最下面的点的横坐标。
\(S(i,j)=\min\limits_{0\le k\le m}\{k^2-2jk+j^2+(las_k-i)^2\}\)
那么我们想要截距尽量的小,维护一个下凸包 \(x\) 轴是 \(k\) , \(y\) 轴是 \(k^2+(las_k-i)^2\) ,直接单调队列斜率优化。(code)
CF1572C Paint
首先发现所有连续的颜色相同的可以缩为一个点。
一个比较妙的 DP 定义方式 \(f_{i,j}\) 表示最终颜色为 \(s_j\) 的最小操作数,如果改变颜色答案不会更优。
显然可以由 \(\min\{f_{i+1,j},f_{i,j-1}\}+1\) 转移过来。
也可以与右端点颜色相同的地方转移过来也就是 \(f_{i,pre_j}+f_{pre_j+1,j}\) 转移。
由于同一颜色最多有 20 个因此复杂度允许。(code)
CF258D Little Elephant and Broken Sorting
AT4513 [AGC030D] Inversion Sum
这俩其实是一个题 (双倍经验??)
直接一点的状态定义方式 \(f_{i,j}\) 表示 \(i\) 比 \(j\) 大的概率。
对于一次交换 \((x,y)\) 直接转移:
对于 \(i=x\) 或者 \(i=y\) 的情况特殊转移即可。(code(CF258D))
AT2672 [AGC018C] Coins
反悔贪心,设 \(e_i=b_i-a_i,f_i=c_i-a_i\) ,一开始都选择金币。
对于 \((e_i,f_i),(e_j,f_j)\), 假设 i 选 f 且 j 选 e ,考虑什么时候交换他们的选择收益不会变少,也就是 \(e_i + f_j \geq e_j + f_i\)
于是可以根据 \(e_i-f_i\) 从大到小进行排序,这样就可以保证有一个决策点是最有的并且银币都在他前边,铜币都在他后面。
于是可以通过优先队列处理前缀选 \(y\) 个,后缀选 \(z\) 个的贡献,枚举分割点统计答案。(code)
CF325E The Red Button
一个非常好的构造题,显然的是奇数一定没有解。
然后发现 \(i\) 和 \(i+\dfrac{n}{2}\) 其实是等价的,那么他俩选择的一定是不同的走法,那么先默认 \(i\) 选 \(2i \bmod n\) , \(i+\dfrac{n}{2}\) 选 \((2i+1) \bmod n\)
并茶几维护,如果两个所在环不是同一个,那就交换两个的决策使得两个环合并起来。(code)
CF1572E Polygon
二分+区间 DP check
貌似读入需要逆时针排序,但是由于出题人良心就不需要啦~~~(code)