CF1344
Codeforces Round #639 (Div. 1)
A
用桶判定即可。
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]\),得:
因此 \(\Delta f_i(x)\) 是单调不降的。
考虑一开始所有的 \(b_i\) 都为 \(0\),每次可以将某个 \(b_i\) 加 \(1\),要加 \(k\) 次。最优情况下每次操作后的变化量是单调不降的,因此可以二分最后一次操作的变化量,设二分的变化量为 \(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)\) 最优,得:
可以二分 \(\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\) 来优化。