洛谷四月月赛Div.2 题解

Solution

A

若二元组 ( i , j ) (i,j) (i,j) 合法,当且仅当 S i < S j S_i < S_j Si<Sj

我们从后往前枚举 i i i ,并通过一个桶来找到最靠后的满足 S i < S j S_i<S_j Si<Sj j j j;若存在一个这样的 j j j,则直接输出即可。

时间复杂度 O ( n ) O(n) O(n)

B

我们找到黑色棋子的气,然后对于气的每一个连通块判断它的气是否为 0 0 0 即可。若气为 0 0 0 的气不超过 1 1 1 个,则答案为 NO \text{NO} NO,否则为 YES \text{YES} YES

C

算法一

不难发现,每次换油后,油价单调不增。于是,我们将加油站按照油价排序。

考虑 dp \text{dp} dp 。令 f i f_i fi 表示目前到第 i i i 个加油站的最小花费,转移如下:

f i = min ⁡ 0 ≤ j < i { f j + ∣ x i − x j ∣ × c j } f_i = \min_{0 \le j<i} \{f_j+|x_i-x_j| \times c_j\} fi=0j<imin{fj+xixj×cj}

采用李超线段树来维护转移即可。时间复杂度 O ( n log ⁡ 2 n ) O(n \log^2 n) O(nlog2n)

算法二

我们对于每一个加油站,找到它之前第一个油价小于它的加油站 u u u 以及它之后第一个油价小于它的加油站 v v v,然后连边 ( i , u , ∣ x i − x u ∣ × c i ) , ( i , v , ∣ x i − x v ∣ × c i ) \left(i,u,|x_i-x_u| \times c_i\right),(i,v,|x_i-x_v| \times c_i) (i,u,xixu×ci),(i,v,xixv×ci) ,最后跑最短路即可。

时间复杂度依然为 O ( n log ⁡ n ) O(n \log n) O(nlogn)

D1

考虑分治。

令当前分治区间为 [ l , r ] [l,r] [l,r],中间点为 m i d mid mid,我们需要求出所有跨越中间点的区间的最大独立集之和。

f i , 0 f_{i,0} fi,0 表示,若 a m i d a_{mid} amid 在独立集中,区间 [ i , m i d ] [i,mid] [i,mid] 的最大独立集。 f i , 1 f_{i,1} fi,1 则为 a m i d a_{mid} amid 无限制的情况下的最大独立集。

g i , 0 g_{i,0} gi,0 表示,若 a m i d + 1 a_{mid+1} amid+1 在独立集中,区间 [ m i d + 1 , i ] [mid+1,i] [mid+1,i] 的最大独立集。 g i , 1 g_{i,1} gi,1 同理。

l ≤ a ≤ m i d < b ≤ R l \le a \le mid < b \le R lamid<bR,则 f ( a , b ) = max ⁡ ( f a , 0 + g b , 1 , f a , 1 + g b , 0 ) f(a,b)=\max(f_{a,0}+g_{b,1},f_{a,1}+g_{b,0}) f(a,b)=max(fa,0+gb,1,fa,1+gb,0) 。现在,关键在于求出

∑ a = l m i d ∑ a = m i d + 1 r max ⁡ ( f a , 0 + g b , 1 , f a , 1 + g b , 0 ) \sum_{a=l}^{mid} \sum_{a=mid+1}^r \max(f_{a,0}+g_{b,1},f_{a,1}+g_{b,0}) a=lmida=mid+1rmax(fa,0+gb,1,fa,1+gb,0)

我们枚举 a a a,并计算其贡献。直接计算较为困难,于是考虑将 max ⁡ \max max 去掉。

f a , 0 + g b , 1 > f a , 1 + g b , 0 f_{a,0}+g_{b,1} > f_{a,1}+g_{b,0} fa,0+gb,1>fa,1+gb,0,则显然是 f a , 0 + g b , 1 f_{a,0}+g_{b,1} fa,0+gb,1 产生贡献。考虑怎样的 b b b 才能满足上述式子,不难得到

f a , 0 − f a , 1 > g b , 0 − g b , 1 f_{a,0}-f_{a,1} > g_{b,0}-g_{b,1} fa,0fa,1>gb,0gb,1

也就是说,我们要求出所有满足 g b , 0 − g b , 1 < f a , 0 , f a , 1 g_{b,0}-g_{b,1} < f_{a,0},f_{a,1} gb,0gb,1<fa,0,fa,1 g b , 1 g_{b,1} gb,1 的数量与 g b , 1 g_{b,1} gb,1 的和。我们可以将它“离线”下来,通过排序与双指针来求出这两个值。

f a , 1 + g b , 0 f_{a,1}+g_{b,0} fa,1+gb,0 产生贡献的情况同理。

令时间复杂度为 T ( n ) T(n) T(n),则 T ( n ) = 2 T ( n 2 ) + n log ⁡ n = O ( n log ⁡ 2 n ) T(n)=2T(\frac n 2)+n \log n=O(n \log^2 n) T(n)=2T(2n)+nlogn=O(nlog2n)

D2

Lemma

F ( i , j ) = 2 F ( i + 1 , j − 1 ) + F ( i , j − 1 ) − F ( i + 1 , j ) F(i,j)=2F(i+1,j-1)+F(i,j-1)-F(i+1,j) F(i,j)=2F(i+1,j1)+F(i,j1)F(i+1,j)

观察上面的式子,不难发现:我们只需要求出第 1 1 1 列的所有 F F F 与第 m m m 列的所有 F F F ,然后直接递推就好了。

时间复杂度 O ( m 2 ) O(m^2) O(m2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值