test10.15

T1
容易想到把捕鱼点和卖鱼点放在一起按坐标排序,那么能到的卖鱼点就是在当前坐标前的全部卖鱼点,考虑新到一个捕鱼点或一个卖鱼点的贡献。
1、到一个新的捕鱼点
贡献就是有更多鱼能卖了。
2、到一个新的卖鱼点
贡献就是多一种价格和数量。
考虑当前拥有的鱼数和经过的卖鱼点,贪心地把鱼卖给价格更高的人,全部卖掉再撤销掉多卖的部分,那就是撤销到价格最小的那部分。
上个BIT,把价格离散化后插到树状数组上查找即可。
时间复杂度\(O(nlogn)\)



T2
令\(l_i=p_{i,1},r_i=s_i-p_{i,m}\),假设当前已知间隔长度为\(len\),则两条绳子\(i,j\)能按顺序合并起来当且仅当\(r_i+l_j=len\)。
考虑图论建模,如何把\(l,r\)间的连边转化为绳子间的连边。

\[r_i+l_j=len\rightarrow r_i=len-l_j \]

我们将每条绳子的\(len-l,r\)当作点连边,那么当绳子\(i,j\)可以按顺序合并起来时,\(r_i=len-l_j\)
同时我们又对\(len-l_j,r_j\)连边,即\(r_i,r_j\)连边,这样就是两条绳子间的关系了,跑欧拉路就能构造出答案。
还有一个问题是\(len\)是什么,对于一条内部至少有两个点的绳子,相邻两个点的间隔已经被固定了,此时\(len\)就等于一条绳子内相邻点的间隔,反之若有两条绳子的内部间隔不一样,那么全局无解。
如果全部绳子内部都只有一个点,考虑最终答案的形态,会有一个\(l\)和一个\(r\)没被匹配,且剩下的\(l,r\)一定一一匹配且和相同,由于单调性,如果一个小的\(l\)和一个\(r\)匹配,那么对于一个更大的\(l\),只能让更小的\(r\)与它匹配,所以对\(l\)升序排序,\(r\)降序排序,取\(l_1,l_2,r_1,r_2\),两两匹配四种情况都跑一遍即可
时间复杂度\(O(nlogn)\)



T3
Baka's trick



T4
显然二分图最大流模型,源点向机器人连容量为\(c_i\)的边,容器向汇点连容量为\(a_i\)的边,机器人与容器间的边容量为\(+\infty\),答案就是这张二分图的最大流,根据最大流最小割原理,只需要求出最小割即可,又因为机器人与容器间的边容量为\(+\infty\),所以任意一条机器人与容器间的边都不可被隔断,即相邻的机器人与容器必须在同一个划分集合内。
设机器人集合为\(U\),容器集合为\(V\),定义一个机器人集合\(S\)的容器邻域为\(N(S)\)。
形式化的,要求$$\min_{S\subseteq U} \lbrace \sum_{i\notin S}c_i+\sum_{i\in N(S)} a_i \rbrace=\sum_{i=1}^mc_i-\max_S \lbrace \sum_{i\in S}c_i-\sum_{i\in N(S)}a_i \rbrace$$

考虑求后面\(\max\)的部分,考虑枚举容器集合\(T\),贪心的最大化\(\sum c\),那就是把\(N(T)\)中的元素全部选上,即\(\max\lbrace \sum_{i\in N(T)}c_i-\sum_{i\in T}a_i\rbrace\)
定义\(w(l,r)=\sum_{l\leq l_i \wedge r_i\leq r}c_i-\sum_{i=l}^r a_i\)
选择最优的\(T\)的过程形如在容器序列中选择若干个不交的连续段,答案就是这些连续段的\(w\)之和。
设\(f(i)\)表示处理了前缀\([1,i]\)容器的答案,有

\[f(i)=\max\{ f(i-1),\max_{1\leq j\leq i}\{f(j-1)+w(j,i)\}\} \]

可以线段树扫描线优化到\(O(nlogn)\)。
具体实现:遍历右端点\(i\),在到一个新的\(i\)时,在\([1,i]\)插入\(-a_i\),在\([i,i]\)插入\(f(i-1)\),对于右端点为\(i\)的区间\(k\),在\([1,l_k]\)加入区间\(k\)的贡献\(c_k\),查询全局最大值即可。


再考虑\(t_i=1\)的部分,对于每个\(x\)枚举\(l\leq x\leq r\),显然区间\([l,r]\)的答案为\(w(l,r)\)。
再加上区间外的部分,即\(t_i=0\)的部分,可以按照上述dp维护前缀后缀的答案\(f,g\),则贡献为\(f(l-1)+g(r+1)\),

\[ans=\max_{l\leq x\leq r}\lbrace f(l-1)+w(l,r)+g(r+1)\rbrace\\ =\max_{1\leq l\leq x}\max_{x\leq r\leq n}\lbrace f(l-1)+w(l,r)+g(r+1)\rbrace \]

能发现这是一个平面直角坐标系上的矩形加和矩形最大值,可以直接树套树解决。
如果我们只考虑以\(x\)为右端点的区间,是容易的,可以线段树扫描线\(O(nlogn)\)。
但现在的右端点是\(x\leq r \leq n\),我们可以把\(x\)从\(n\)到\(1\)枚举,每次计算以\(x\)为右端点的答案,记录在左端点上,同时保留区间历史最大值,每次查询左端点为\([1,x]\)的区间历史最大值即可。

具体实现:在枚举\(x\)前遍历\(1\)到\(n\),在\([1,i]\)插入\(-a_i\),在\([i,i]\)插入\(f(i-1)\),对于右端点为\(i\)的区间\(k\),在\([1,l_k]\)加入区间\(k\)的贡献\(c_k\),全部插入完后的线段树上\(i\)位置上的值就是\(-\sum_{j=i}^na_j+f(i-1)+\sum_{l_j\leq i}c_j\)。
在每次计算完一个\(x\)的答案要转移到\(x-1\)时,插销掉\(a_x\)的贡献和右端点为\(x\)的区间的贡献,即在\([1,x]\)插入\(a_i\),在对于右端点为\(x\)的区间\(k\),在\([1,l_k]\)加入\(-c_k\),这样每次查询新的\([1,x]\)时,线段树上\(i\)位置上的值就是\(\sum_{j=i}^xa_j+f(i-1)+\sum_{l_j\leq i\wedge r_j\leq x}c_j\),第一项和第三项的和就是\(w(l,x)\),但现在还差\(g(x+1)\),只需要在计算\(x\)的答案前在\([1,x]\)加入\(g(x+1)\),然后直接撤销贡献,即在\([1,x]\)加入\(-g(x+1)\),这样当前的最大值不变,但由于先前的加入,历史最大值考虑到了\(g(x+1)\)的贡献,在此时查询历史最大值得到的答案就是考虑了右端点为\(x\)的情况的答案。
时间复杂度\(O((n+m)logn)\)

posted @ 2026-10-16 20:09  Jklans  阅读(8)  评论(0)    收藏  举报