AtCoder 记录

AtCoder 记录

My account

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

posted @ 2021-08-23 16:05  juju527  阅读(116)  评论(3编辑  收藏  举报