Codeforces vp 寄

难度标记:

\(\verb!A!\) :基本上秒了。
\(\verb!B!\) :有一定难度,需要想一会或者需要看题解,但看完题解后就完全理解了。
\(\verb!C!\) :看完题解后还需要想一会,甚至仍然不会。

+ 和 - 表示在同档题中的难度。

注:题解中的题号对应洛谷题号,可能会出现 \(\rm Div1A\) 是某场 \(\rm Div3G1\) 的情况。

Codeforces Round 694 (Div. 1)

最终 \(\rm performance\) \(2568\),大概在正式选手前 \(140\)

简要题解:

CF1470A($\verb!A-!$)

考虑贪心,显然 \(k_i\) 越大的需要先匹配。

于是排序,能匹配就匹配即可。

\(2 \min\) 就过了。

CF1470B($\verb!A!$)

发现两个数 \(x,y\) 满足 \(\dfrac{\text{lcm}(x,y)}{\text{gcd}(x,y)}\) 是个完全平方的条件是质因子分解后每个质因子的奇偶性相同。

考虑把 \(a_i=\prod p_i^{q_i}\) 改成 \(a_i=\prod p_i^{q_i \bmod 2}\),然后合并同类项,计每种 \(a_i\) 的出现次数为 \(siz_{a_i}\)

发现如果 \(siz_{a_i}\) 是个偶数则会在第一轮以后和 \(0\) 合并。

然后就做完了,判断 \(w\) 是不是 \(0\),然后对应输出就行了。

用时 \(25 \min\),主要是开 \(\verb!long long!\) 被卡常了。

CF1470C($\verb!B-!$)

没切。

其实这题也不难,但是有点神秘。

需要发现一个关键性质就是在伪装者左边的人会 \(<k\),右边的会 \(>k\),如果距离它很远,还没有被扩散到就是 \(k\)

然后就可以每次跳 \(i\) 步,直到跳到一个点 \(\neq k\),然后根据这个点的值往左或往右走最多 \(i\) 步,找到伪装者。

大概只要五六百次就能找到。

CF1470D($\verb!A!$)

非常 \(\rm Atcoder\) 的构造题,但是很简单。

发现图不连通就寄了。

否则考虑 \(\rm Dfs\) 生成树,遍历点 \(x\) 的所有返祖边(包括 \(x\)\(fa_x\) 之间的边),如果 \(x\) 通过返租边能走到一个被染色的点,那么 \(x\) 就不染色,否则染色。

不难发现这样一定连通,于是做完了。

用时 \(21 \min\)

Codeforces Round 905 (Div. 1)

最终 \(\rm performance\) \(2348\),大概在正式选手前 \(252\)

最下饭的一集。

简要题解

CF1883G1($\verb!A-!$)

先把 \(a\) 序列和 \(b\) 序列

对于每个 \(a_i\) 找到 \(b\) 中第一个 \(j\) 满足 \(b_j>a_i\),令 \(d_i=j\)

不难发现答案就是 \(\max |d_i-i|\),要特判 \(b\) 中没有东西大于 \(a_i\) 的情况,此时 \(d_i=n+1\)

然后就做完了,\(6 \min\) 过了,此时一切正常。

CF1883G2($\verb!A-!$)

先假设 \(a_1\) 是最小的。

对于 \(a_1\) 不是最小的情况,相当于前缀减。

由于值域很大,但是不同的答案只有 \(\Theta(n)\) 个,排序离散化一下就做完了。

看起来很简单是吧,但是我有很多下饭操作:

  • 看错 \(m\) 的值域,以为可以暴力枚举,不需要离散化。

  • 离散化写的很丁真,调不出来。

最后花了 \(37 \min\) 过 /yun,一罚。

CF1883B($\verb!A-!$)

挺傻的一道题,也几乎看完就秒了。

假设我最终要经过点 \(p_1,p_2,...,p_m\)

那么我显然越早经过 \(p_i\) 越优。

做一个类似 \(\rm Dijkstra\) 的过程,每次取出 \(dis_x\) 最小的 \(x\),然后遍历 \(x\) 的出边,对于每种时间点维护一个 \(\rm vector\),每次在 \(\rm vector\) 上二分就行了。

花了 \(16 \min\) 才过,主要是题目看错了一次。

CF1883C($\verb!A+!$)

一开始在想哈希。

维护两颗线段树,分别维护当前哈希值和最优的哈希值。

然后每次在线段树上二分找到第一个不同的位置就行了。

但是写了一会儿后发现非常阿拉丁,并且会被卡常。

果断换做法。

考虑维护 \(a_i-best_i\)

在线段树上二分找到第一个 \(a_i-best_i<0\) 的位置,然后 \(\rm check\) 一下这个位置前面有没有 \(a_j-best_j>0\) 即可。

\(45 \min\) 才过 /yun,两罚。

CF1883D($\verb!B!$)

大概是不是很难的题。

考虑如何做到 \(\Theta (nq)\)

枚举值域分界点 \(i\),把 \(\le i\) 的放在左边,\(>i\) 的放在右边,判断行不行。

但是这很难优化。

不妨假设 \(a_i\) 是值域分界点,然后求出 \(l,r\) 的范围。

首先 \(a_i\) 得是左边的区间最大值。

\(x\)\(a_i\) 左边第一个大于它的数,那么 \(x<l \le i\)

同时右边的区间必须得全部 \(>a_i\)

\(y\)\(a_i\) 右边第一个大于它的位置,\(z\)\(y\) 后面第一个小于 \(a_i\) 的位置。

那么 \(y \le r <z\)

这样就变成了 \(\Theta (n)\) 个矩形,判断某个点是否在这些矩形里。

离线然后用 \(\rm Bit\) 维护即可。

posted @ 2023-11-10 21:13  Tx_Lcy  阅读(37)  评论(0)    收藏  举报