CSP-S2考前综合强化刷题 Day2

小路灯

n n n 个小路灯坐标 a 1 ∼ a n a_1 \sim a_n a1an,请你点亮 k k k 个小路灯,使得每个小路灯与距离最近的点亮小路灯的距离最大值最小。

读错题好评,认为是点亮小路灯间距离最大值最小,还过样例并爆零了。这个大概是你选的小路灯一定是连续的,那么就是一个区间在滑动求区间最小值。

读对后好像更简单,二分一下最大值,这样能不点亮就不点亮 check 一下。

序列

直接暴力~~

如果一次交换是 O ( 1 ) O(1) O(1) 的,那么复杂度是调和级数,而链表会打乱数组中相邻的顺序。但是,你可以把操作看成这样

1 2 3     4 5 6
   2 3 1     5 6 4

那么把数组开到两倍模拟一下就好了。时间复杂度 O ( n ln ⁡ n ) O(n\ln n) O(nlnn)

路灯

开始读错题了,但样例没过,所以没爆零。

f i , j , k f_{i,j,k} fi,j,k 为前 i i i 个路灯处理完了,我们点亮了第 i i i 个路灯,且 i i i 左边点亮的路灯是 j j j,已经点亮了 k k k 个,这样你再预处理 s l , r s_{l,r} sl,r 表示, l l l r r r 点亮后它们之间答案,就可以转移了,而且 j j j 那一维不需要在状态中出现。

拓展题目 P2679 子串。

f i , j , k , l f_{i,j,k,l} fi,j,k,l A A A 匹配到前 i i i 位, B B B 匹配到前 j j j 位,匹配了 k k k 个子串,且第 i i i 位和第 j j j 位有没有匹配成功的方案数。对 s i s_i si 是不是等于 s j s_j sj 讨论转移就行了。

再拓展一下,如果选 k k k 个子序列呢?先考虑选 1 1 1 个子串,那就是不限制匹配多少个子串,然后你一定能把它拆成 k k k 个子序列,插板法一下。

匹配

求树上满足两两间距离为 4 4 4 的三点的乘积和。

先考虑一个问题,给定一个长为 n n n 的序列求所有三元点对的乘积和。你可以从左向右遍历一个个插入数,维护三个东西:选三个数的乘积和,选两个数的乘积和,选一个数的和,这样你加进来一个数,你维护的三个东西可以根据分配率更新。

那么考虑树上的问题,我们把一个点向上的部分也当成一颗子树,我们要满足两两间距离为 4 4 4,画画图可以知道这三个点肯定都经过一个枢纽,且离这个枢纽的距离为 2 2 2,而且没有两个点在同一棵子树中。


那么如果你能把一个点所有儿子的子树中,距离这个枢纽为 2 2 2 的点数求出来,也就是每个儿子的儿子数,那么可以看成一个序列一个个插了。直接树形 dp 即可。

拓展 联合权值 & POI2014 HOT Hotels

给定一棵树,求有多少组两两距离相等的三点。 1 ≤ n ≤ 5000 1 \leq n \leq 5000 1n5000

类似地,对于每个点,你用树形 dp 求一个 f i , j f_{i,j} fi,j 表示在 i i i 的子树中,与 i i i 距离为 j j j 的点数,你可以用 f y , j − 1 f_{y,j-1} fy,j1 去更新 f x , j f_{x,j} fx,j 然后还是一个个插进去算。

挑战当 n ≤ 1 0 5 n \leq 10^5 n105 怎么搞?

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值