2023年 1月 做题记录

LOJ #10132 异象石

题目简述:支持对树上一点集删单点和加单点的操作,询问点集组成的虚树的边权之和(虚树边权为原树上两点间距离)。
做法:考虑给定点集答案的求法,将其中的点按dfs序排序,使dfs序从小到大的点依次相邻,同时使dfs序最大和最小的相邻,构成一个环。环上相邻点的距离就是答案。再考虑修改时的贡献,例如增加一个点,则把点集这个点的前驱和后继的距离从答案中减去,在将这个点到前驱的距离,这个点到后继的距离加回来。
参考题解:Link

LOJ #10110 太鼓达人

这是一道欧拉回路的题目。考虑将题目中给出的传感器表示变形。
传感器是长度为K的二进制串。记传感器 A [ a 1 a 2 . . . a k ] A[a_1a_2...a_k] A[a1a2...ak] ,则右边相邻的传感器 B [ a 2 a 3 . . . a k a k + 1 ] B[a_2a_3...a_ka_{k+1}] B[a2a3...akak+1]。将A->B的关系用边表示: U [ a 1 a 2 . . . a k − 1 ] U[a_1a_2...a_{k-1}] U[a1a2...ak1] 通过边 a k a_{k} ak 到达 V [ a 2 a 3 . . . a k ] V[a_2a_3...a_{k}] V[a2a3...ak]
发现我们可以用一条边表示一个传感器,即起点上的二进制串和边上的二进制数码(0或1)拼起来。当传感器长度为K时,有点 2 k − 1 2^{k-1} 2k1 个,边 2 k 2^{k} 2k 条。容易发现这是一欧拉图。故所有的边可以走到。建出图从0为起点,先走0边,进行dfs。

LOJ #10061 最短母串

这样一种最短母串无法快速设计出来,故考虑搜索。
我们以模式串建立AC自动机,并从起点开始广搜。若搜索到某一节点s上,状态为字符串 S S S,则经过一条边 K K K,状态变为 S + K S+K S+K。第一个包含所有模式串的状态,即是最小母串。我们考虑一状态的包含模式串数。一个新状态包含的模式串有转移之前旧状态包含的模式串和新转移到的点包含的模式串。题目中模式串的数量不超过12,故包含模式串的信息可以状压表示,并在转移过程中用新加进来的点更新。
对于每一种情况(在AC自动机的节点 u u u,包含模式串的状压为 s s s)只会入对一次。故时间复杂度为 2 n ∗ s u m ∣ S ∣ 2^n*sum|S| 2nsumS

LOJ #10062 病毒

显然,先将模式串建出AC自动机。我们可以把构造串的过程视作一个点在AC自动机上转移,将沿途的边代表的字符按顺序拼接。
构造串中不能出现任何一个模式串,说明不能经过后缀中存在end标记的节点。同时我们需要串可以无限长,则点需要最终能够在一个环上循环转移。故我们需要在不能经过的点被剔除后,找到一个从起点0出发,终止于一个环的路线,通过dfs实现。

LOJ #10174 动物园

状压DP趣味题。首先需要把握如何统计贡献。对于每一个小孩,其可视区间都为5,所以我们可以将孩子的贡献统一放在区间的端点上。 n n n 个端点对应 n n n 个区间。设第 i i i 个区间为 [ i , i + 4 ] [i,i+4] [i,i+4] d p [ i ] [ s ] dp[i][s] dp[i][s] 表示前 i i i 个区间,第 i i i 个区间状态为 s s s(状压)的贡献和的最大值。
转移方程: f [ i ] [ s ] = m a x ( f [ i − 1 ] [ ( s & 15 ) < < 1 ] , f [ i − 1 ] [ ( s & 15 ) < < 1 ∣ 1 ] ) + n u m ( i , s ) f[i][s]=max(f[i-1][(s\&15)<<1],f[i-1][(s\&15)<<1|1])+num(i,s) f[i][s]=max(f[i1][(s&15)<<1],f[i1][(s&15)<<1∣1])+num(i,s)
其中 n u m ( i , s ) num(i,s) num(i,s) 是第i个区间取状态s的贡献值,可以预处理;而 ( s & 15 ) < < 1 (s\&15)<<1 (s&15)<<1 ( s & 15 ) < < 1 ∣ 1 ] (s\&15)<<1|1] (s&15)<<1∣1] 则巧妙联系了相邻区间的关系,及 i − 1 i-1 i1 区间的状态后四位和 i i i 区间的前四位相同。
最后需要关注,对于呈环形的 n n n 个区间,第 n n n 个区间和第1个区间满足相邻区间的关系。

LOJ #10183 股票交易

单调队列辅助dp,困难在讨论和推dp方程上。
题目中 T T T M A X P MAXP MAXP 的范围在 [ 1 , 2000 ] [1,2000] [1,2000],允许我们开二维的数组,设计状态 f i , j f_{i, j} fi,j 表示第 i i i 天后,持有 j j j 股股票,所赚得的最大利润。这里的利润不包括股票在当天卖出的价值。

分类讨论:

1.在当天凭空买进。

f i , j = − A P ∗ j ( 0 ≤ j ≤ A S ) f_{i, j}=-AP*j (0\le j\le AS) fi,j=APj(0jAS)

2.从前一天继承下来,如果继承,则赚的钱同前一天保持不变。

f i , j = m a x ( f i , j , f i − 1 , j ) ( 0 ≤ j ≤ M A X P ) f_{i, j}=max(f_{i, j}, f_{i-1, j}) (0\le j\le MAXP) fi,j=max(fi,j,fi1,j)(0jMAXP)

3.从W天之前的某一天买入若干股转移而来。

f i , j = m a x k = 1 m i n ( j , A S ) ( f i , j , f i − W − 1 , j − k − A P ∗ k ) f_{i, j}=max_{k=1}^{min(j, AS)}(f_{i, j}, f_{i-W-1, j-k}-AP*k)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值