2023.11.30 近期练习
CF1887C
首先容易想到区间加需转化为差分,字典序的比较呢就考虑二分哈希。
二分第一个不一样的位置,这个位置也一定是差分数组第一个不一样的。
把哈希如果放到线段树上,那么在线段树上二分即可。
我们依次处理修改的时候,顺便处理当前的最小的字典序。
我们这里如果采用主席树,那么会发现空间过大,无法通过。
事实上我们只需维护两个线段树即可,一个维护当前版本的值,一个维护字典序最小的版本。
但是如果出现了当前版本更小,我们如何把第二个线段树更新呢?
只需把操作存下来,更新的时候再把操作依次放上去即可。
这种问题就是哈希上线段树。
CF1886E
首先将 \(a\) 从大到小排序,根据贪心猜想:每个项目选的人一定是一段连续区间。
由于 \(m\) 很小,设状态 \(f_s\) 表示当前做了 \(s\) 集合的项目,从大到小用,最少用几个人,
考虑转移,如果从 \(t\) 转移到 \(s\),当前做 \(i\) 项目,那么我们要求最大的 \(j\),满足
\(a_j\times (n-f[t]-j+1) \ge b_i\)。
转移时 \(f_s=\min(f_s,n-j+1)\)。
直接求 \(j\) 是难求的,不妨枚举 \(i,j\),求对于每个 \(j\) 能贡献的位置区间,直接解不等式即可。
然后做完了。
这种问题要多猜并找性质。
CF1876D
关于第二个要求,很容易看出对于每种值,红蓝必须间隔染色。
第三个要求呢,猜想到容斥,其次发现,红色与蓝色是等价的,
所以红色字典序大的方案和蓝色字典序的方案是相同的,我们只需总方案减去字典序相同的方案除 \(2\) 即可。
关于总方案数,如果值的个数是 \(m\),那么就是 \(2^m\),因为每种值只有两种方案。
关于求字典序相同的,就是每位都相同。
我们从第一位开始想,如果 \(a_1=b\),被红色染了,那么第二个 \(a_j=b\) 一定需要是蓝色,
且 \(1\sim j-1\) 只能被红色染,发现 \(1\sim j-1\) 不能出现重复的值,这些值的染色方案都被确定了。
也就是说,如果我们把每种值,相邻奇数位和偶数位看成区间,所有区间必须不能有包含关系。
而且对于相交的区间,这些值的染法只有两种。
想到利用并查集,求出值的等价类个数 \(num\),答案容斥即可。
这种问题要看出等价类,以及熟练并查集的应用。
CF1866K
对于一次询问 \(u\),可以将答案分为不经过 \(u\) 的直径,和经过 \(u\) 的直径。
关于不经过 \(u\) 的直径,直接预处理好了。
经过 \(u\) 的直径的话,对于所有 \((u,v,w)\),设 \(v\) 不经过 \(u\) 最长路是 \(d_v\),
那么现在要求 \(k\times w_{u,v}+d_v\) 的最大值和次大值。
先处理 \(d_v\),这个可以使用换根 dp,只需要记录经过 \(v\) 的最长路和次长路即可。
其次处理上面的式子,容易发现这是一个一次函数的形式,不难想到用李超线段树维护。
但是要求最大值,还要求次大值。
考虑把最大值的直线剔除,设编号为 \(x\),我们不妨前后缀处理一下,求 \(pre_{x-1},suf_{x+1}\) 中的最大值。
是需要离线下来处理即可。
这种问题是李超线段树,和前后缀优化的应用。