Loading

Codeforces 19xx 合集

*CF1900

  • D. Small GCD

欧拉反演,之后枚举约数 \(d\) 及其倍数,搞一个后缀和即可。复杂度 \(O(n+V\log V)\)

  • E. Transitive Graph

由于新图奇怪的限制,所以缩点后一个 SCC 里的点都是可达且可以从任意点出去的,由于并没有让构造方案,简单 dp 就完事了。

  • *F. Local Deletions

attention,每次操作后,至多留下一半元素,所以至多会有 \(\log n\) 次操作。考虑先对整个序列暴力模拟,记路下来每一层的情况。然后询问的时候调用这个,但是端点处的值可能会有变动,其他位置其实没有变化。所以每次多维护一下端点处的值有没有被删即可。

update:不是端点处,而是端点处 \(O(\log n)\) 个数,这个维护就稍微麻烦一点。

*CF1901

2024.7.15

  • E. Compressed Tree

看到树上联通块,和容易想到树形 dp,我的做法比较无脑,直接记录这个点有几个儿子被选了(\(0/1/2/3\)),\(3\) 以上是一样的,统一记作 \(3\)。剩下来考虑维护一条链,这条链中间部分全部不计入答案。细节:\(2\) 个儿子的时候,中间这个被枚举的点也不用记入答案。

  • *F. Landscaping

梯形的面积减去那个奇怪形状的面积不就是答案吗?要求这个最小,也就是要求梯形面积最小,而梯形面积即为 \(\dfrac{y_0+y_1}{2}\times n\)。也就是最小化 \(y_0+y_1\)。那么不带修的情况就容易了,维护出上凸包,然后找到中点处过凸包上的哪条线。现在问题变成了动态维护凸包。

到前面这一步都想到了,但是事实上不需要动态维护凸包,只需要从中间切开,然后分别维护凸包即可。

CF1902

2024.7.4

  • D. Robot Queries

离线扫描线,显然是分成两种情况讨论,对于中间反转的请况,可以稍微移项讨论。

  • E. Collapsing Strings

先全部加起来,然后减去重复的部分。将匹配串反向,其他串正向建 trie,每匹配上一位,在 trie 上记录有子树中有多少个串,匹配上一位,这些串的答案全部需要减少 \(2\)

  • F. Trees and XOR Queries Again

差分,然后前缀线性基合并,最后在线性基里查询即可。

CF1903

CF1904

  • D2. Set To Max (Hard Version)

考虑对于每一个 \(i\) 判断,那么就得找到 \(b_i\)\(a\) 数组中左右最近出现的位置,并且判断这之间有没有 \(b_j<b_i\)。另外,\(b_i\) 还必须是 \(a\) 的这一段区间的 \(\max\)。使用线段树维护,空间小一点时间都无所谓。

  • E. Tree Queries

换根 dp,每次操作相当于删掉 \(O(1)\) 个区间,然后查询深度的最大值。换根的时候,其实就是 \(O(1)\) 个区间变化,也可以线段树维护。

  • *F. Beautiful Tree

这都没想到?暴力的做法是连边,然后跑拓扑排序。直接树剖+线段树优化建图,复杂度就对了。

*CF1920

vp. 但是中途被拉去拿快递所以 F1 没写完。

*CF1967

  • B2. Reverse Card (Hard Version)

需要一点观察,记 \(d=\gcd(a,b)\),并且 \(a=pd,b=qd\),那么 \(\gcd(p,q)=1\) 并且 \((p+q)\mid qd\),显然 \((p+q)\mid d\)。所以 \(p\le d,q\le d\),又 \(pd\le n\),所以 \(p\le \sqrt(n)\)。那么暴力枚举 \(p,q\),并且判断是否互质,再统计出合法的 \(d\) 即可。复杂度 \(O(\sqrt{nm}\log n)\)

CF1968

  • F. Equal XOR Segments

如果区间的异或和为 \(0\) 那一定可以找到一个地方断开,否则,必须得有一个前缀恰好等于这个疑惑和的值(且后面区间长度至少是 \(2\))。可以离线扫描线,但是为了展示实力选择在线做法,直接用 std::set 存下来所有异或值的位置,然后二分找就好了。

  • G2. Division + LCP (hard version)

枚举 LCP 的长度,然后暴力找到最多匹配几个位置,每次贪心的找到最前的位置即可。这样复杂度是 \(O(n\log ^2n)\) 的,可以通过。

*CF1969

  • E. Unique Array

考虑对于一个不合法的极小子串,随便改一个数即可。那么从前往后枚举,对于每个前缀,如果发现这个前缀的一个后缀是一个不合法的,那么改一下它,这整个前缀都可以丢掉了。如果不改这里,后面改了也没有用,所以这里必须改。模拟这个过程,可以考虑扫描线并且用线段树维护。

  • *F. Card Pairing

显然,出现两张同样的牌的时候,直接消就好了。所以只用考虑没有相同的牌的情况,注意到手中恰好有 \(k\) 张牌,所以一定是互不相同的 \(k\) 种全部都有。下文把这种状态称作非平凡状态,并且会有加粗。在非平凡状态选择,看起来就很有后效性,所以可能贪心看起来更靠谱。但是看到这个数据范围其实看起来就知道不太能贪心。还是考虑 dp,但是换一种答案的统计方式即费用提前计算。

CF1974

  • A. Phone Desktop

每个手机只能填两个大的,先把大的填完,然后剩下的地方用小的补上,最后小的不够用了再拿新的手机。

  • B. Symmetric Encoding

直接模拟吧。

  • C. Beautiful Triple Pairs

一个比较好写的做法,是先不管那个不同的,把所有存在两个相同的都加上,最后减去三遍三个都相同的部分。

  • D. Ingenuity-2

写起来有点细节。先只考虑一种方向(比如南北),显然必须是两者数量同奇偶才有答案,构造的话来回选 R、H 就好了。然后换一种方向的时候,把 R、H 的优先级调换一下顺序写起来会好受一点。

  • E. Money Buys Happiness

看到这个数据范围就想 dp 了吧,\(dp_{i,j}\) 代表幸福度为 \(j\) 的最大钱数,转移先看能不能减,然后最后别忘了全体加上最后的收益。

  • F. Cutting Game

维护两个方向的平衡树,然后删的时候如果已经被删过了就不计入答案,每个点最多被删两次,均摊复杂度正确。

  • G. Money Buys Less Happiness Now

注意这里幸福度的收益是一样,所以直接按从小到大的顺序贪心的去取肯定是最优的,那么用数据结构(线段树)维护一下这个过程就好了。

posted @ 2024-07-03 21:58  Semsue  阅读(4)  评论(0编辑  收藏  举报
Title