AtCoder 记录
AtCoder 记录
vp的场大概会打上[vp]的tag
ARC125
场上通过:\(1A\ B\) \(\texttt{rk}823\ \texttt{perf}1425\)
A:20min B:65min
非常不合理,输光场,AB 手速太慢,A 还因为边界没 return 罚了一次时
B 题由于一开始nt,写 \(\sqrt{k^2+n}-k\leq v\) 的式子很久都解决不了 \(10^{24}\) 开根的精度问题
后来冷静思考考虑 \(n\) 和 \(2kv+v^2\) 就是 \(10^{18}\) 级的比较了,浪费了半小时
一开始 B 还在想枚举 \(y\),感觉十分没有前途
C 题最后半小时没过是因为一开始没注意到保证一定有解,想了很久无解的情况无果,心态炸裂
场上没有看 D,赛后看完就秒了,非常自闭
补题:C D E F
E
问题变为一个 \(m\times n\) 的矩阵
第 \(i\) 行元素总和不超过 \(A_i\),第 \(j\) 列元素总和不超过 \(C_j\),第 \(j\) 列每个元素不超过 \(B_j\)
考虑一个最大流模型:
\(S\to SL_{i}\),边权为 \(A_i\);
\(SL_i\to SC_j\),边权为 \(B_j\);
\(SC_j\to T\),边权为 \(C_j\)。
显然 \(SL_i\to SC_j\) 边上的流量代表原矩阵里 \((i,j)\) 点上的元素值
网络流的复杂度显然我们难以接受
考虑模拟最小割:
对于 \(SL_i\),记其是否属于 \(S\) 集合的贡献为 \(0\) / \(A_i\)
对于 \(SC_j\),记其是否属于 \(S\) 集合的贡献为 \(C_j\) / \(cnt*B_j\),\(cnt\) 为 \(SL\) 里属于 \(S\) 的个数
由于贡献只跟 \(cnt\) 有关,考虑枚举 \(cnt\)
对于 \(SL\) 选 \(A_i\) 最大的 \(cnt\) 个放进 \(S\) 里得到最小的贡献
对于 \(SC\) 可以对于 \(\dfrac{C_j}{B_j}\) 排序,决策是一个区间,容易维护
复杂度 \(O((n+m)\log n)\)
F
计算 \((x,y)\) 对的个数,简单转化为 \((x,y-x)\) 的对数
使得 \(x\in[0,n],y\in[0,n-2]\)
这个操作让所有度数减一即可实现
我们猜想对于同一个的 \(y\) ,\(x\) 的合法值为一段区间
记 \(mn_y,mx_y\) 分别表示最小/大的 \(x\) 满足 \((x,y)\) 合法
记 \(z\) 为度数为 \(0\) 的点的个数,那么 \(x\in[mn_y,mn_y+z]\cup [mx_y-z,mx_y]\) 显然合法
我们能证明:\(mn_y+z\geq mx_y-z\) 即 \(mx_y-mn_y\leq 2z\)
证明如下:
设任意一个点集 \(S\) 的权值为 \(W(S)=\sum_{i\in S}d_i-|S|\)
\(W(S)\) 的下界在 \(S\) 中均为度数为 \(0\) 点时取到,为 \(-z\)
上界在 \(S\) 中不存在度数为 \(0\) 点时取到,为 \(n-2-(n-z)=z-2\)
则 \(-z\leq W(S)\leq z-2\)
带入 \((mn_y,y),(mx_y,y)\)
则 \(mx_y-mn_y\leq 2z-2\),故命题成立
我们只需 dp 出 \(mn,mx\) 即可
由于 \(d_i\) 的取值只有 \(O(\sqrt n)\) 种,运用单调队列优化多重背包可以做到 \(O(\sum_{d}[cnt_d>0]\lfloor\dfrac n d\rfloor\times d=n\sqrt n)\)
ARC127
场上通过:\(1A\ B\) \(\texttt{rk}449 \ \texttt{perf}1614\)
A:27min B:\(+\infty\)
考场看完 \(A\),一眼就会了,写几亿年才对,感觉学文化学傻了
然后发现不会 \(B\),编了好久 \(C\),自闭于小细节(赛后发现编号减 \(1\) 即可解决这个 bug,真的是拉)
最后 rk 实在是巨大低,直接 copy xzy 代码
补题:C D E