CF1344

Codeforces Round #639 (Div. 1)

A

\[\large\begin{aligned} x+a_{x \bmod n}&=y+a_{y \bmod n} \\ x-y&=a_{y \bmod n}-a_{x \bmod n} \\ k_1n+i-(k_2n+j)&=a_j-a_i \\ (k_1-k_2)n&=j+a_j-(i+a_i) \\ i+a_i &\equiv j+a_j \pmod{n} \end{aligned} \]

用桶判定即可。

B

发现在同一行或同一列中最多出现一段连续的黑格,不然 \(N\) 极磁铁就会被吸到黑格之间的白格。若某一行不存在黑格,则所有列不能都有黑格,可以在该行中没有黑格的一列放一个 \(S\) 极磁铁,因为当前行列都没有黑格,所以其不会产生影响,列的情况同理。

判完无解后,答案为黑色连通块个数。

C

不等关系具有传递性,将其用有向边表示,即若 \(x_i<x_j\) 则连边 \(i \to j\),有环则无解。

发现当 \(i<j\) 时,若 \(x_i\)\(x_j\) 存在不等关系 \(x_i<x_j\)\(x_j>x_i\) 时,\(j\) 必须为 \(E\),其在图上对应的就是能否到达。那么可以建出正图反图后拓扑排序,求出每个点能到达的最小的编号和能到达该点的最小的编号,通过这个就能判断每个点是 \(A\) 还是 \(E\) 了。

D

\(f_i(x)=x(a_i-x^2),x\in[0,a_i]\),得:

\[\large\begin{aligned} &\Delta f_i(x) \\ =&f_i(x+1)-f_i(x) \\ =&(x+1)(a_i-(x+1)^2)-x(a_i-x^2) \\ =&-3x^2-3x+a_i-1 \end{aligned} \]

因此 \(\Delta f_i(x)\) 是单调不降的。

考虑一开始所有的 \(b_i\) 都为 \(0\),每次可以将某个 \(b_i\)\(1\),要加 \(k\) 次。最优情况下每次操作后的变化量是单调不降的,因此可以二分最后一次操作的变化量,设二分的变化量为 \(v\),得:

\[\large-3x^2-3x+a_i-1 \geqslant v \]

可以通过二分或者求根公式得出每个 \(b_i\) 要至少加多少,根据二分的结果调整即可构造方案。

本题为求多元函数在限制下的极值,因此也可以用拉格朗日乘数法做。其为在满足 \(\sum\limits_{i=1}^n b_i=k\) 的限制下,最大化 \(\sum\limits_{i=1}^n b_i(a_i-b_i^2)\)

\(f(b_i)=\sum\limits_{i=1}^n b_i(a_i-b_i^2),\varphi(b_i)=\sum\limits_{i=1}^n b_i-k\),拉格朗日函数为 \(L(b_i)=f(b_i)+\lambda\varphi(b_i)\)

得拉格朗日函数 \(L(b_i)\) 梯度为 \(0\) 时,\(f(b_i)\) 最优,得:

\[\large\begin{aligned} \nabla_{b_i}L(b_i)=0,\forall i \in [1,n] \\ \nabla_{b_i}\left( \sum\limits_{i=1}^n b_i(a_i-b_i^2)+\lambda\left(\sum\limits_{i=1}^n b_i-k\right) \right)=0,\forall i \in [1,n] \\ a_i-3b_i^2=\lambda,\forall i \in [1,n] \end{aligned} \]

可以二分 \(\lambda\),因为还有 \(b_i \leqslant a_i\) 的限制,得到的 \(b_i\) 可能不合法,因此在外面还要再套一层二分。

E

考虑每个非叶子节点 \(x\),所有经过该节点的火车按经过 \(x\) 的时间 \(t_i\) 排序后得二元组 \((t_i,e_i)\)\(e_i\) 为下一步走的边,还要考虑初始存在的边,即 \((0,e_0)\)。对于排序后相邻的 \((t_i,e_i),(t_{i+1},e_{i+1})\),若 \(e_i \ne e_{i+1}\),则必须在时间区间 \([t_i+1,t_{i+1}]\) 内对 \(x\) 进行一次操作,否则会在 \(t_i\) 时刻爆炸。

发现改变开关来使 \(x\) 到根的路径连通,很像 \(LCT\) 中的 \(access\) 操作,因此时间区间的个数是 \(O(n+m \log n)\) 的。在树上用 \(set\) 启发式合并即可找出所有的时间区间。

对所有时间区间按左端点排序后进行扫描,用堆维护当前可以操作的右端点,每次取最小的右端点操作,若每个时刻的右端点小于当前扫到的时刻,则第一问答案即为该右端点,第二问答案为小于第一问答案的右端点个数。

F

\(R\)\(1\)\(Y\)\(2\)\(B\)\(3\)\(W\)\(.\)\(0\),设每个位置对应的值在二进制下的两位为 \(a_i,b_i\),不难得每种操作的转化:

\(\operatorname{mix}\) 操作:求选出的数的异或和。

\(\operatorname{RY}\) 操作:交换 \(a_i,b_i\)

\(\operatorname{RB}\) 操作:\(b_i \leftarrow a_i \operatorname{xor} b_i\)

\(\operatorname{YB}\) 操作:\(a_i \leftarrow a_i \operatorname{xor} b_i\)

那么任何时刻的 \(a_i,b_i\) 都可以用初始值表示,于是就得到了 \(2n\) 个未知数 \(2k\) 个方程的异或方程组,高斯消元即可,还需用 \(bitset\) 来优化。

posted @ 2020-10-16 21:07  lhm_liu  阅读(207)  评论(0编辑  收藏  举报