2/2考试总结

文章记录了一次编程竞赛中的解题过程,涉及题目包括树结构维护、状态压缩、动态规划优化。作者在T1中应用霍尔定理解决集合匹配问题,T2中使用位运算和线段树处理集合操作,T3则涉及到网络流和动态规划的结合。作者反思了暴力枚举和复杂度优化的方法,并提出了改进思路。
摘要由CSDN通过智能技术生成

时间安排

8:30–8:50 T1,题意要求在lca汇合,估计是要拿什么树上的结构维护一下。T2, k <=1e9 是虚的,实际状态数上限只有 O(n) 级别,对于部分分貌似直接暴力就行了,正解可能要二分什么的。T3,对于暴力可以 dp ,然后找一个优秀一点的形式估计可以做一个 n ^ 3 到 n ^ 2 的 dp 。
8:50–10:15 T1,c=2 小数据的时候可以暴力统计集合然后贪心计算,考虑 c!=2 的时候怎么做,考虑能不能在树上做桶,发现解决不了重叠的问题。发现可以网络流,二分答案然后暴力建图网络流,复杂度 qn\sqrt m log V, n,m都是 3000 级别的感觉有点爆炸,但是实现的优秀一点就跑得飞快。
10:15–10:38 T2,发现状态种类不超过 O(n) ,于是如果暴力处理,总复杂度也只在 n ^ 2 ,左右,这样可以拿到 40 分。可以直接用 vector 暴力存储集合元素,然后对 vector sort 。
10:38–10:56 T3,首先把暴力写一下,暴力枚举路径长度和答案,枚举出边 dp 就行了 n ^ 5 ,非常劣,感觉没什么前途,于是考虑其他角度。
10:56–12:00
T3,考虑可以钦定一段路径来计算答案,这个路径可以在图上预处理出来,理想情况下处理是 n ^ 3 的,dp 貌似可以做到 n ^ 2,只能做到 20 分。分析题目后发现由于每个点连边数固定,所以整个 dp 和原图毫无关系,预处理部分可以 O(1) 解决。于是考虑 dp ,发现不好去重,尝试换个思路。
T2,发现可以一位位确定元素值,但是这样最坏是 n ^ 2 的。
12:00–12:20 吃饭。回想 T3 ,突然意识到每个点延续和不延续的方案数已知,只要求极长的延续段小于等于一个上界即可,这个是可以 n ^ 2 做的。
12:20–12:46 T3 , n ^ 2,考虑每个点是延续还是不延续两种情况即可。枚举上界 lim ,可以求出 <= lim 的方案数,差分即可。
12:46–13:30 回看 T1,T2 。暂时没有什么新的想法,而且开始犯困了。临结束想到了一个同时做两个莫队的阴间玩意。

回顾反思

T1:
c=2 部分分没写有点可惜,要求两个点分别到 lca 路径上的点的集合,比赛的时候一直在想怎么区分元素,但实际上只要拆成两个询问莫队就可以维护了。
正解是考虑霍尔定理。考虑两个点集 S,T ,那么枚举 S 的子集 Sp,其对应一个 T 的子集 Tp,那么要使 S 里每个点都匹配的一个数量 n u m = min ⁡ { ⌊ ∣ T p ∣ ∣ S p ∣ ⌋ } num = \min\{\lfloor\frac{|Tp|}{|Sp|}\rfloor\} num=min{⌊SpTp⌋} 。该题中 |S| 很小,于是只要维护出 |T| 就可以了,运用 bitset 维护,可以很好解决取并、去重问题。
霍尔定理要熟悉一下。
T2:
基本思路差不太多,按位考虑,可以用线段树快速计算出对应位置的数量之和。
一个trick 是如何便捷的实现集合去重:可以对集合的里的元素分别赋一个随机值,令每个集合对应一个包含元素随机权值的异或和,那么判断两个集合是否相等只要看一下异或和是否相等就可以了。
T3:
E ( x ) = ∑ ( P ( x = i ) ∗ i ) = ∑ P ( x > = i ) E(x)=\sum (P(x=i)*i)=\sum P(x>=i) E(x)=(P(x=i)i)=P(x>=i)
于是可以枚举一个标准 lim ,求答案大于等于 lim 的方案数。
那么存在某个以 x 为开头的极长串长度至少为 lim ,这个 x 可以取 1 -> n,对应方案集合 S1,S2,S3…S4 ,那么要对这些集合取并。
可考虑容斥,变为取交。枚举这是 r 个集合的交,即有 r 个位置都是极长串的开头,那么要求每个极长串之间不得有交,且开头处不得与左边的点构成新的一段,那么 r 个串占用 r*lim 个位置,用组合数可以直接计算,对边界情况稍加讨论即可,容斥系数为 ( − 1 ) r + 1 (-1)^{r+1} (1)r+1
另一个小的点是,需要注意 ∑ i = 1 n ∑ i ∗ j < = n \sum\limits_{i=1}^n\sum\limits_{i*j<=n} i=1nij<=n 的枚举复杂度是 n log ⁡ n n\log n nlogn 的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值