2023.9.1 AT practise

ARC072F

设“热量”为 \(T_1V_1+T_2V_2+...\),最后要求的温度就是 \(\dfrac{T_1V_1+T_2V_2+...}{V_1+V_2+...}\)
由于最后体积是恒定的,那么我们只需要解决热量的问题即可。

\(f_{i,x}\) 表示第 \(i\) 天晚上只能留下 \(x\) 升水的最大热量。
如果我们把写成函数 \(f_i(x)\),我们发现其一定是上凸的函数。
因为我们有这样一个策略:
若加入的水温度高,那么我们肯定不想让其跟热量低的水混合。(斜率大)
若加入的水温度低,那么我们肯定想让其跟热量高的水混合。(斜率低)
那么我们可以维护凸壳。

每天加水的操作就是相当于在底部加了一个矢量,然后处理一下这个凸壳。

图片中原点跟某个点连线取 \(\max\),其实就是混合的操作。
大抵是如此,我们用单调队列维护凸壳即可。

ARC073F

首先有一个浅显的做法:\(f_{i,j}\) 表示完成第 \(i\) 个要求,其中一个人在 \(a_i\),一个人在 \(j\),的最小代价。
转移是 \(f_{i,j}\leftarrow f_{i-1,j}+|a_i-a_{i-1}|\)
\(f_{i,a_{i-1}}\leftarrow \min(f_{i-1,j}+|j-a_i|)\)

如果把每个 \(f_i\) 扔到线段树上维护呢?
我们发现第一个转移就是全局加,打一个 tag 即可。
第二个转移如何操作呢?首先先把绝对值拆开,
对于 \(j\le a_i\) 的,贡献是 \(f_{i-1,j}-j+a_i\).
对于 \(j>a_i\) 的,贡献是 \(f_{i-1,j}+j-a_i\).
那么我们分别维护 \(f_j-j,f_j+j\) 的最小值即可,区间查询。

枚举 \(i\) 的同时,顺便更新线段树就行了的。

ARC074E

我们考虑如何设状态:
\(f_{i,j,k}\) 表示前 \(i\) 位,往前第一位和 \(a_i\) 不一样的位置是 \(j\),和 \(a_i,a_j\) 都不一样的位置是 \(k\).
这样我们就方便处理关于区间颜色数了,从 \(j+1\sim i\) 都只有 \(1\) 种颜色,\(k+1\sim j\)\(2\) 种,\(1\sim k\)\(3\) 种。
转移的话我们只需要枚举第 \(i\) 位填的是和 \(a_j\) 一样还是和 \(a_k\) 一样和 \(a_{i-1}\) 即可。

我们考虑怎么处理限制,我们可以把限制都挂在右端点上,再把不合法的设为 \(0\) 即可。

ARC074F

拆点,考虑网络流,求最小割即可。
然而每行/每列里两两点都建边太耗费大,我们每行,每列建一个虚点,连接这里面所有点即可。

posted @ 2023-09-01 21:52  s1monG  阅读(18)  评论(0)    收藏  举报