- 第十九场
- T1 一开始我就发现了0的重要性,具体地
- 当没有0的时候答案就是全部区间
- 有0的时候就是形如 0, 1, …… x-1 的排列数
- 这个时候我就只会枚举区间进行求解
- 我也发现了一些比较关键的性质
- 长度为 \(len\) 的区间最大值是 \(len-1\) 且数字两两不同
- 法一
- 我也考虑了枚举最大值的想法,但是我没有想到这种做法是 \(O(N \log{N})\) 的\jk
- 但是实际上 \(l_i\) 表示 \(i\) 之前第一个大于 \(a_i\) 的, \(r_i\) 表示 \(i\) 之后第一个大于 \(a_i\) 的位置,然后直接枚举区间 \(\min(i-l_i,r_i-i)\),这样是 \(O(N \log{N})\) 的
- 为什么是 \(O(N log N)\) 的因为你考虑最大的数然后可以发现序列被分成了两半,然后后面的数同理
- 实际上这个 trick 在某一场的梦熊模拟赛用到过,但是我存了侥幸心理没有探究其中的原理,导致这场比赛没有想到这个 trick
- 问号:现在问题转化为了有 \(O(N \log{N})\) 个区间,破防了我靠,那我也不会给 \(N \log{N}\) 个区间判是不是排列啊/jk,估计出题人自己也没有仔细想这个做法吧/fn
- 法二
- 分治
- \(mid\) 表示中间位置,然后枚举最大值的位置就行了
- /jk 明明这么简单我为什么没有想到/jk 常规套路见少了导致的,题做少了导致的/jk 需要多做一些以分治为trick的题目
- 法三
- 扫描线
- 定义序列的权值 \(len - 1\) - \(i\) 和 \(i+1\) 都出现的个数,故可以使用扫描线来计算所有点的权值为 0 的个数即可
- 为什么没有想到/fn,因为自己对于这种转化问题不太敏感?/yiw,套路见少了,智商不在线导致的/fn
- 判断两个集合是否相等,我们可以给每一个数赋一个随机权值,定义一个集合的权值为所有数的异或和,集合相等的 充要条件 是权值相等
- 法四
- 满足要求的序列中 0 肯定是恰好出现一次
- 故可以分段然后类似于分治的想法直接求解即可/fad 可以做到 \(O(N \log{N})\)
- 因为我们在枚举右端点的时候可以发现变化量是不会超过 \(len\) 的(分出来的序列长度),故可以直接去维护
- 时间复杂度可以做到 \(O(N)\)
- 枚举0的思路在我脑海中是出现过的,但是我甚至1秒钟就把这件事情给否定了,我可能是觉得这件事情不现实,但是它就是正解,我认为在有着充足的时间的时候我应该把每一个思路都去想一下,有前途的思路去把它想明白
- T2
- 精简题意之后我们可以把问题转换为
- 初始有 \(x\) 到第 \(i\) 轮的时候可以进行两种操作之一
- \(x = \max(0, x-a_i)\)
- \(x = x + b_i\)
- 需要对每个 \(k\) 求出刚好做了 \(k\) 次第二种操作和 \(n-k\) 次第一种操作后 \(x\) 的最大值
- 考场的时候我想到了直接定义 \(f_{i,j}\) 表示执行完第 \(i\) 次操作,有 \(j\) 次第二种操作的 \(x\) 的最大值,并且拿到了 60 分的暴力分
- 根据作者的思维是考虑如果固定了选择操作的策略,有没有什么方法可以快速表示最终的数。
- 根据作者的思维是把操作用 折线的形式表现了出来
- 考虑这条折线最低点对应的值,记为 \(mn\),以及这条折线最后一个点对应的值,记为 \(s\),最终 \(x\) 的值就是 \(s-mn\)。
- 积累新 trick,当数值变化较为清晰或者简单的时候可以考虑用折线进行表示
- 由于要最大化 \(x\) 的值,所以可以直接钦定 \(mn\) 的位置。钦定最小值的位置可以这样理解:因为要最大化 \(s−mn\),\(mn\) 是最小值,如果钦定到的位置不是最小值,那求出来的的值肯定比真实答案要小,所以这样算并不会把答案算错。
- 接下来我们可以发现可以对于每个 \(k\) 倒着枚举最小值 \(mn\) 的位置,选前 \(k\) 大的 \(a_i + b_i\) 给它加上去,这是出题人理想当中我们的暴力 60 分做法,然而我是想的 DP 故没有前途去优化
- 对于这个我们可以发现对于 \(pos_i\) 为每个 \(k = i\) 时使 \(x\) 最大的 \(mn\) 的位置是 单调不降的,可以使用反证法进行简单证明
- 故可以使用决策单调性的整体二分的分治解法进行求解
- 定义 \(solve(l,r,pl,pr)\) 表示求 \(k \in [l,r]\) 的 \(pos\) 区间在 \([pl,pr]\) 内
- 可以使用权值线段树来求解前 \(k\) 大的 \(a_i + b_i\) 的问题,实现细节是最好要钦定一个从后往前的顺序这样可以使权值线段树成为全局的
- 时间复杂度是 \(O(N \log{N})\) 的
- T3
- 精简题意
- 给定 \(n\) 和 \(m\),对于每一个 \(1<=k<=n+m\) 求出满足这些条件的01序列的个数
- 恰好有 \(n\) 个0,恰好有 \(m\) 个
- 不存在一个子区间使得 1 的个数和 0 的个数的差(绝对值)> k
- 我们发现 DP 和枚举都不行,对于01序列,我们可以钦定 0 是向左 1 是向上(这又是一个trick),然后就变为了一条折线
- 对于我们可以把第二条 \(k\) 的限制转换为存在一个 \(b\) 使得 \(y=x+b+k\) 和 \(y=x+b\) 两条直线把这条折线夹在中间
- 反射容斥
- 考虑不同 \(k\) 直接有什么共同的点
- 直接裂开了冥思苦想坐牢2个半小时反复听回放看题解无果/fn,有个地方甚至没有交代这个函数是做什么的,极度破防/jk,只会 \(O(N*2)\) 的做法
- T4
- 这场真难吧,T4这真的能碰吗/jk 好的能
- 这里对于我来说我只学会了 \(O (N^2 \log{N})\) 的做法,满分做法十分复杂/jk 得分是56分左右
- 因为考虑一个点 \((x,y)\) 以第一个人的坐标为 原点 然后吧所有点的坐标改为对于第一个人的相对坐标
- 然后我们可以发现我们可以枚举第一个人的方向
- 当 \(x=y\) 时我们一定会让自己和第一个人直接相遇而不是间接
- 若 \(x != y\) 则朝着绝对值大的靠近第一个人的那个方向走
- 然后我们就可以考虑使用 dij 来做这件事了
- P14363 [CSP-S 2025] 谐音替换
- 大概是最多两三分钟就想到了要卡着不同的位置,然后想着不同位置的部分 s1 要等于 t1,s2 要等于 t2,然后一直卡在怎么用不是枚举左右端点的方法去实现匹配上两边的,中间我是想过 ac自动机 的,但是我因为有两个串所以我就没往这方面想了/fn,我根本没有想下去其实它们是可以合在一起的/jk/ll,而且我读题的时候明明重点关注了 |t1| != |t2| 的,结果我忘记我特殊性质B写没写判断了没了/fn,但是我记得我的纯暴力的25分是判断了的。
- 实际上可以用 ABD->ACD 的串变成一个 A?BC?D ,对于s和t都是这样,然后跑 AC 自动机就行了,这不直接后悔死了啊/ll/ll/ll 破防了但日子得继续全力备战NOIP吧/fendou
posted @
2025-11-03 10:21
睡神本神
阅读(
12)
评论()
收藏
举报