【提高A组】20230111模拟赛总结反思

文章介绍了四个编程问题,涉及树结构、路径计算、动态规划和数据结构应用。问题1利用LCA和树上差分计算每个节点监视的运动员数量;问题2和3涉及优化操作序列以求最大值;问题4则要求在有根树中找出符合条件的好三元组。作者强调学习STL和算法技巧对提高解题效率的重要性。
摘要由CSDN通过智能技术生成

Problem 1

题目大意

有一棵树,上面有 m m m 个运动员,每个运动员以每秒 1 1 1 条边的速度运动,其中对于运动员 i i i ,他从第 0 0 0 秒从 S i S_i Si 出发,沿最短路径到达 T i T_i Ti 。每一个节点会在比赛开始后在第 w i w_i wi 监视运动员。问每个节点监视时有多少个运动员。

赛时

有两个思路:

  1. 打暴力, O ( n m + n l o g n ) O(nm+nlogn) O(nm+nlogn),期望25pts
  2. 树链剖分+multiset , O ( n l o g n × m u l t i s e t 复杂度 ) O(nlogn \times multiset复杂度) O(nlogn×multiset复杂度),期望95pts,可惜不会打multiset

还好没有挂分

正解

lca+树上差分
对于每个运动员 i i i

  • l c a i lca_i lcai S i S_i Si T i T_i Ti 的最近公共祖先
  • 将路径 ( S i S_i Si, T i T_i Ti) 拆成 ( S i S_i Si, l c a i lca_i lcai) 和 ( l c a i lca_i lcai, T i T_i Ti) 两部分
    • 对于 ( S i S_i Si, l c a i lca_i lcai) ,可产生贡献的点 p p p 满足 d e p p + w p = d e p S i dep_p+w_p=dep_{S_i} depp+wp=depSi
    • 对于 ( l c a i lca_i lcai, T i T_i Ti) ,可产生贡献的点 p p p 满足 d i s t ( S i , T i ) − w p = d e p T i − d e p p dist_{(S_i,T_i)}-w_p=dep_{T_i}-dep_p dist(Si,Ti)wp=depTidepp d i s t ( S i , T i ) − d e p T i = w p − d e p p dist_{(S_i,T_i)}-dep_{T_i}=w_p-dep_p dist(Si,Ti)depTi=wpdepp
  • 用两个桶进行维护

Problem 2

题目大意

有n只蚯蚓进行m次操作:

  1. 选出一只最长的蚯蚓然后切为 p × x p\times x p×x x − p × x x-p\times x xp×x两部分
  2. 其余未选中的蚯蚓长度+ q q q
    p p p q q q 均为常数)
    问这m次选择蚯蚓的长度和m次操作后每只蚯蚓的长度

赛时

无脑模拟,加优先队列优化,期望65pts

正解

不难发现被切的蚯蚓的长度不断变小,于是开三条队列维护即可


Problem 3

题目大意

不想赘述啊
有一个序列 a i a_i ai ,在其中选出序列 p j p_j pj 使得 A − i × X + ∑ p j a p j + X A-i\times X+\sum_{p_j}{a_{p_j}+X} Ai×X+pjapj+X
要找到一个序列使得 ∑ [ b i − b i − 1 − ∑ [ b i − 1 < p j ≤ b i ] ≥ h i ] \sum{[b_i - b_{i-1} - \sum[b_{i-1}<p_j\le b_i]\ge h_i]} [bibi1[bi1<pjbi]hi]最大

赛时

dp
f i , j f_{i,j} fi,j表示前i个区间贡献j个价值时最大值
f i − 1 , j f_{i-1,j} fi1,j f i − 1 , j − 1 f_{i-1,j-1} fi1,j1贡献过来
O ( m 2 + n l o g n ) O(m^2+nlogn) O(m2+nlogn),期望100 90->80pts

正解

赛时状态转移方程错了,需在方程中进行贪心。 O ( m 2 n l o g n ) O(m^2nlogn) O(m2nlogn)


Problem 4

题目大意

有一棵 n 个节点,以 1 号节点为根的有根树,每个节点有点权 a i a_i ai
对于一个三元组 ( x , y , z ) (x,y,z) (x,y,z),如果满足 a x + a z = a y a_x+a_z=a_y ax+az=ay,并且 x x x y y y 的祖先, y y y z z z 的 祖先,那么就称这个三元组是好的。请你输出一共有多少好的三元组。

赛时

暴力,期望30pts->25pts

正解

树分块不会待学


总结

  1. 有空的时候学一些stl,以便自己打代码,同时便于找到思路
  2. 多积累新算法
  3. 正常发挥,不要挂分!!!
  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值