2024.7 做题记录 2 / 顾影自怜了几回 直到看见妄自蕤

CF653E

不难发现其实就是在假想中建立出可以存在的边的图,要求跟 \(1\) 相连的连通块个数 \(\leq k\) 且与 \(1\) 的连边个数 \(\geq k\) 且 全图联通,这个我们只需要知道其去掉 \(1\) 的连通性就很好讨论了。

我们其实不能直接建出这个极度稠密的图,但是我们可以用数据结构优化建图,直接线段树优化建图即可,具体而言我们维护线段树区间 \([l,r]\) 对应一个点 \(node_{l,r}\),比如说 \(x\) 第一次需要这个区间的就往 \([l,r]\) 上面依次连边,然后记录好 \(node_{l,r}\gets x\),之后如果要这个区间直接跟 \(x\) 连上就行了,但是这样子还是会 mle 喵,我们可以加一个小剪枝,就是说如果我们理论上要去拿一个 \(x\) 去连接已经有 \(node_{l,r}\)\([l,r]\) 的子区间,可以直接连到 \(node_{l,r}\) 上面,反正连通性一样,然后这样就过掉了喵喵喵 >w<


CF965E

比较滴唐,直接建立出字典树,然后结点可能是有/无字符的,然后一个无字符点可以换一个子树中的有字符点上去,这个东西还是比较随便的,直接树上从下往上合并就可以了,可以 dfn 一个序列每次找区间 rmq + 带修改是一个可爱的线段树。听课的时候说,字典树的插入关键点的 \(\sum dep_i=\sum |S_i|\),其实暴力合并复杂度也很对。


CF1260E

你的朋友具有贿赂他人的能力,其实你的朋友才是最强的,对于原题中在 \(-1\) 左边的 \(a_i\gets 0\) 之后变成了,打败一个人 \(i\) 的代价是 \(a_i\) 询问最小代价。

然后有两个比较显然的观察,除去你的朋友能力值最强的人肯定会贡献 & 将除了你的朋友的人分成 \(1,2,\dots,\frac{n}{2}\) 这样一块一块然后每一块最强的人 win 肯定会贡献。

那我们照着这两个比较显然的东西往下想,但是我们好像没办法直接钦定除了你的朋友的意义下的最强者的一个很具体的连通块,那我们应该考虑一个合法的 winner 集合,这个 winner 集合的第一位一定是第一好孩子,假设这个第一好孩子喵了一个大小为 \(x_1\) 的连通块,那么去掉之后前 \(x_1+1\) 的超级好孩子都可以成为第二好孩子,假设这个第二好孩子喵了一个大小为 \(x_2\) 的连通块,那么去掉第一第二好孩子后前 \(x_1+x_2+1\) 的超级好孩子都可以成为第三好孩子,以此类推,贪心的想,\(x_i\) 肯定直接倒序给嘛,然后具体的获得 winner 就直接在堆里面贪心就好啦。


CF623B

首先注意到 \(m<n\),然后质数不劣,那 \(a_1,a_n\) 的质因数可能成为一个公约数且一定存在一个最优的公约数,现在考虑这个 \(p\) 的答案是什么,直接 dp 求出就可以了,具体的必须删除的位置要多仔细考虑一下。


CF1088E

首先观察到答案为 \(Ans\),那么选和 \(<Ans\) 都很没有必要,那么 \(k=1\) 肯定可以卷出一个 \(Ans\),卷出 \(Ans\) 之后最大化 \(k\) 就直接 dp 的时候碰到最好的置 \(0\) 答案 \(+1\),相当于一个尽量往下选的贪心。


CF794D

首先先考虑这个图长成什么样子,然后不难发现假设自己能到达自己,那么同一种 \(x\) 的能到达集合是相同的,我们对能到达的集合的点进行哈希,然后 \(x\) 相同的颜色块就可以拿出来了,然后连接不同颜色块的边的约束其实是一个差为 \(1\),使用 dfs 染色就可以了,为了方便可以从链的端点出发去染色。染完色之后暴力判定就行了,我觉得方便的判定方式是先判定边数是否正确,再判定原题中的边现在是否合法。


CF1139D

不妨设 \(p(len)\) 表示到 \(len\) 停止的概率,显然 \(Ans=\sum_{len=1}^{\infty}p(len)\times len=\sum_{i=1}^{\infty}p(len\geq i)\),这个 \(len=i\) 的时候 \(\gcd=1\) 太特殊感觉应该是归到不合法那一类的了,我们提出来,因为 \(\sum_{i=1}^{\infty} p(i)=1\) 所以就是 \(Ans=1+\sum_{i=1}^{\infty}p(len>i)\)

这个 \(p(len>i)\) 很明显可以反演之类的,我们推一下嘛,\(p(len>i)=\frac{\sum[\gcd_{j=1,\dots,i}\{a_j\}\neq 1]}{m^i}=\frac{\sum(1-[\gcd_{j=1,\dots,i}\{a_j\}=1])}{m^i}=\frac{1-\sum_{d=1}^{\infty}\mu(d)\times(\lfloor\frac{m}{d}\rfloor)^i}{m^i}=\frac{-\sum_{d=2}^{\infty}\mu(d)\times (\lfloor\frac{m}{d}\rfloor)^i}{m^i}\),不难发现这个柿子带回去是好算的。

带回去 \(Ans=1+\sum_{d=2}^{\infty}-\mu(d)\times \sum_{i=1}^{\infty}\frac{(\lfloor\frac{m}{d}\rfloor)^i}{m^i}=1-\sum_{d=2}^m\mu(d)\times \frac{\lfloor\frac{m}{d}\rfloor}{m-\lfloor\frac{m}{d}\rfloor}\) 就可以啦。


CF1696D

首先瞎建图感觉不是做不了就是不够好写,我们换个思路,注意到边权为 \(1\) 所以只需要 bfs 就可以解决了,现在的问题是对于一个点 \(x\),我们怎么不重(复杂度)不漏(正确性)找出可以到达的以前没有到达过的点。

不难发现这个问题跟单调栈强相关,暴力的话只要沿着单调栈的指针跳就可以了,但是我们不能太暴力,指针形成树,我们可以 上帝造题的 7 min 那样每次并查集向父亲合并表示删除,然后就做完了,注意到这个单调栈上元素不是充要条件,实现的时候要跟 rmq 比较才充分,这个单调栈的信息已经够了。


P9130

感觉是跟楼房重建一个性质的题目。首先不难发现我们需要维护区间的答案 \(Ans_{l,r}\),吃草天数 \(day_{l,r}\),没有预制菜的情况下剩下的草数 \(out_{l,r}\),这里面只有 \(Ans_{l,r}\) 是不好维护的,我们考虑其具体是什么,显然是 \(Ans_{l,mid}+Ans_{mid+1,r}(out_{l,mid})\),右边是一个查询的形式,那我们写一个单侧递归的线段树去查询就可以了,查询不难做到只单侧递归,于是复杂度 \(O(n\log^2V)\)


P1712

首先这种题目应该钦定一个作为线段长度的最大值 \(r\) 之后再去考虑贡献,然后我比较笨还是不会做,于是我们再考虑钦定一个作为最小值 \(l\),然后怎么判定呢,长度在这个区间里面的全都进行一次覆盖,如果有位置被覆盖次数 \(\geq m\) 的话这一对就可以贡献!就算实际区间不能包含 \(l,r\),那么也代表了其它答案不劣,那放一个垃圾进去取 \(\min\) 不影响正确性。那我们发现这个东西显然可以按照长度排序之后双指针,单调的,然后就做完了。


2024.7.73 练习 B. G

直接主席树去二维数点算贡献就行了,为了好些贡献可以稍微容斥一下。


E. J

题目大意:对于一个序列,有两个操作,\(a_p\gets x\) 和 查询 \(a[l],\dots,a[r]\) 中每种值出现的 最大位置-最小位置 之和。

不难想到去考虑一个差分的贡献 \((pre_i,i):i-pre_i\),然后这个点对对 \(l\leq pre_i<i\leq r\) 的询问 \(l,r\) 贡献,因为带修所以还有一个 \(t<t'\),不难发现这个可以是一个三维偏序问题,离线然后 cdq 分治即可。


CF1556E

首先这个 \(a,b\) 同时存在的话信息有点太多了,而且差分显然没有问题,那么不妨先考虑差分数组 \(c_i\gets b_i-a_i\),然后操作还是在单点上面一加一减。

这个 一加一减 比较容易让人想到差分前缀和这样的东西,我们考虑 \(c\) 的前缀和 \(cw\),然后操作就是在这个 \(cw\) 上面做区间减一,然后有一个上一个区间的结尾 \(<\) 下一个区间的起点 这样的约束,然后发现这个约束非常的无用,就是如果有这种连在一起减的需求直接连在一起就行了,所以答案应该就是区间 rmq。

然后注意到 \(cw\) 最后一位不可以!要求本身就是 \(0\),然后只能加,所以初始不能有负的。


CF1234F

翻转这种事情随便转化一下就其实是两个不交区间贡献了嘛。

这个字符种类很小,我们考虑暴枚一个区间然后算它的贡献,因为字符种类完全不一样所以其实不交是一个不用考虑的东西,所以问题变成了把全部单个区间加进桶里,查询 \(x\) 的补集的存在的子集的最大大小,这个显然可以高维前缀和,然后合并一下答案就做完了。


AT_joisc2016_i

比较 shaber 的基环树上做 dp,实现可以拓扑排序,注意 at 必须输出 ‘\n’ 的唐诗特性。


CF1316E

比较唐诗的背包,但是我卡不过去,常数太大啦!“你常数太烂了”。


CF1675G

考虑一个初始序列 \(a\),一个目标序列 \(b\),按顺序第 \(i\) 个球会走到 \(p_i\),那么 \(a\to b\) 的代价是 \(\sum |i-p_i|\) 这样,这个贡献过于抽象了,我们直接转成前缀和,令 \(sum_1/sum_2\) 表示 \(a/b\) 的前缀和,代价就是 \(\sum |sum_1[i]-sum_2[i]|\),这个手玩一下是比较显然的。

然后就很好 dp 了,我想做不降我就翻转序列嘛,设 \(f[i][j][k]\) 表示前 \(i\) 个数,前缀和为 \(j\),最后一个为 \(k\) 的最小代价,那么转移就有 \(f[i][j][k]=\min\{f[i-1][j-a][a]\}+|j-sum_1[i]|\) 这样,其中 \(a\leq k\),这样子是一个斜线前缀 \(\min\) 的形式,前缀提前递推一下就行了。


CF1039D

为什么这段时间 mx 天天出可以根号的题,甚至还基本都带 \(\log\)(((

考虑根号分治,对于长度为 \(1,\dots,B\) 的直接暴力跑 dp,复杂度 \(O(Bn)\),对于 长度 \(>B\) 的其答案一定 \(\leq \frac{n}{B}\),那么我们对于每一个可能的答案求出最长可以用什么长度的是不是就行了,这个好像可以二分诶,复杂度 \(\frac{n}{B}n\log n\) 这样子,加起来还是一个对勾函数,取一个 \(B\gets \sqrt{n\log n}\) 最优,然后就做完了。

但是这个题目根号洛歌做法需要卡常,递归 dp 常数很大,我们把 dfn 拍下来循环做 dp,然后别的地方常数不要太烂就可以通过此题了。

posted @ 2024-07-19 20:28  Hypoxia571  阅读(42)  评论(0)    收藏  举报