qbxt2023国庆刷题 Day1 ~ Day3
本帖涉及以下内容:
- 超长内容
- 感性理解
- 思路引导
- 屑排版
- 恶意卖萌
Day0
晚上玩恐怖游戏好吓人
Day1
rk4,前
T1
没什么好说的
T2
给定一个等差数列,求他的各项乘积,你只需要输出其对
取模的结果。
具体的,每组给定分别表示公差,长度,首项,你需要求出 。
非常降智好的一道题,赛时往根号分治想,然后寄掉了
我们考虑
然后推广到普遍情况,我们把这个式子提出来
这不就是
注意特判
T3
一条路径上有
个位置,有三种元素: , , 。
初始会向右移动, 初始会向左移动,所有元素移动速度是相同的: 单位距离每 单位时间。
元素的移动遇到边界会改变初始移动方向,并继续移动。
我们称与 为人类, 带有初始为 的能力值。
你作为与 有相同的移动规则,由于带有主角光环,你若出生在位置 初始会有 的能力值。
若有某两元素相遇,他们会开始战斗,战斗不改变移动方向,战斗总是遵循以下两种规则。
1、人类与相遇:人类总是胜利,胜利后人类能力值 。
2、人类与人类相遇:能力值大的获胜,若能力值相同,则获胜,能力值不发生改变。
可以证明,这两条规则覆盖了所有情况。
失败的一方将被立刻移除游戏,胜利的一方将仍继续行进。
由于你是主角,你的左侧总是以的概率刷新 ,你的右侧总是分别以 的概率刷新 或者 。
对于两个特殊位置有特殊的刷新规则: 号位置总是 , 号位置总是 。
你需要求出来你以相同概率随机出生在的某一位置,经过 单位时间后,仍存活的概率。
你需要注意,游戏的进程总是先刷新,然后以一定概率刷新 和 ,然后开始游戏。
可以证明概率总是一个有理数,你只需要输出这个数对 取模的结果。
保证。
对于所有测试点满足。
一道二项式反演题
我们假设现在在考虑第
我们考虑怎么求
一些细节:由于
复杂度分析:有人觉得这是
T4
一行人,共有
个人,排成一排,在等待你发放矿泉水。
你会发放轮矿泉水,第 次,你会给前 个人发放矿泉水,然后你会发放 瓶矿泉水。
具体的,你每次会一瓶一瓶的发矿泉水,每一轮发放次。
每次,你会把矿泉水给最需要的人,即前个人中,当前拥有的矿泉水最少的人,如果有多个人拥有数量相同,你会发给编号靠前的人。
最终,你想知道每个人获得的矿泉水数量。
首先,我们看答案是单调不降的,因此我们可以线段树
从来没做过在线段树某个前缀
LL k;
int search(int x, int p = 1){
int l = tr[ p ].l, r = tr[ p ].r;
if(r <= x && (LL)tr[ p ].maxs * (x - l + 1) - tr[ p ].sum <= k){
k += tr[ p ].sum;
return l;
}
if(l == r) return r + 1;
PushDown(p); int mid = l + r >> 1;
if(x <= mid) return search(x, ls);
int rt = search(x, rs);
if(rt == mid + 1) return search(x, ls);
return rt;
}
大致就是判断右边如果能放就放右边,否则放左边
最终复杂度
杂题选讲
最朴素的是
考虑我们如果
数据范围提示
哪有问题解决哪里,我们二分这个和是多少。具体的,我们考虑答案值域为
二分到最后我们知道了具体的值就好做了,直接找即可
最终复杂度
Day2
下午讲课的时候感觉自己应该都做出来的,但赛时
T1
在赛时看到了这个科技,因此并不算自己做出来了
首先,容易发现答案具有二分性,我们把
然后赛时我在想如何贪心的把一个数放到一个没放的位置,后来发现做法假了就有点慌。
提到整除通常都是判断质因数的关系。我们发现
而对于二分了一个
最终复杂度
T2
我们考虑从特殊
然后考虑
然后我们考虑这个
我们分析一下这么递推的复杂度,显然是
T3
赛时看了一眼觉得是容斥,然而
对于这种有区间限制的题,我们要这么考虑
- 去除多余限制,使左右端点始终保持
- 转移记录最靠右边的满足条件的信息,因为越靠右边越容易满足限制
对于此题,我们发现如果两个区间互相包含,我们只要小的那个区间即可。这样我们就让所有区间在左端点有序时右端点依然有序
对于第二步,我们设
转移是容易的,从这个数依然是不相同的和这个数和前面某个数相同两种情况转移过来即可,最终复杂度
然后考虑正解,我们抛去上面我们所想,考虑容斥。首先考虑
然后扩展到
T4
没什么好说的,只能说赛时最好想的一题,但是是最难写的罢了233
对于所有边和每个点维护动态开点线段树或平衡树即可,注意使用线段树/平衡树二分,而不是直接二分答案,否则会多带
赛后杂题选讲
P8163 [JOI 2022 Final] 铁路旅行 2 (Railway Trip 2)
做题是很重要的,讲课时一个大佬说这题和今年省选
这题是一道很神奇的题。
我们发现如果这个人跳了若干步,他能跳到的点一定是一个区间,因为我们考虑他能从
又因为这题多组询问,
设
可以发现
最终复杂度
小技巧
-
找两个数疑惑和最小(显然)
-
给你一个集合有以下操作
- 全局 + 1
- 求
如果只有2操作,我们显然可以直接按位考虑,但有了
操作,这个东西我们可以把这些数的二进制倒着插入 中,对于一次 操作,我们就是把一个点的左右子树交换,然后递归到 边去,让他一直更新即可 -
给你一个集合有以下操作
- 全局 + 1
- 插入一个数
- 求
这个第二个思路很像,但重点在于怎么用
维护第三个操作。我们可以对于每个节点维护当前节点为根时的答案 ,再维护当前子树大小 ,可以知道
例题:# P6623 [省选联考 2020 A 卷] 树 (显然是板子)
树状数组的一些注意
- 树状数组不能做到单点修改,只能做到单点加
- 树状数组不能做到单点修改前缀
,但可以做到单点取 前缀
总结:树状数组只能更新,不能修改,也就是说对于一些不具有可减性的问题,树状数组不可维护
再谈acwing 299. 裁剪序列
上课讲的题目差不多的例题
还是可以得到
我们考虑扫描线,线段树记录
考虑右端点
最终复杂度
CF1635F Closest Pair
第一眼看的时候以为是线段树维护信息更新的问题,但发现计算的内容和左右端点都有关,遂寄掉
然后听老师说是扫描线,继续思考。考虑固定一个右端点时,哪些左端点可能成为答案,显然左端点的
然后看题解,发现对于一个数
这为什么是对的呢?我们考虑如果有两个在单调栈中的元素,下标分别是
此时显然有
为什么?因为
即
而
于是我们把
此比较难想的性质就是
DLC
晚上
Day3
我刚提的rk3啊)
好险,差点证明P = NP
T1
先把最大的
因此我们每次贪心的让
T2
对于每一个黑点,去距离他最近的一个白点,贪心是优的,因此直接把路径长度加上即可
求最近的白点用并查集
T3
老师曰:这个题
,做法显然不是非常朴素的把图建出来,这时候要考虑两种方式,要么是用一些建图优化把图建出来,要么是用一些别的方式代替朴素的最短路,而这里是前者
显然因为是二进制操作,安位贪心,发现对于每一位我们要把是
然后这里有一个没有部分分的优化,我们发现这个复杂度恨不均衡, 询问
我们发现每个点有两种情况:要么经过中介点,要么没有。我们可以从每个中介点跑
还是不平衡,继续优化,我们可以在询问时看
继续优化,我们先看看
for i : 1 -> n
b[ a[ i ] ] = a[ i ]
for S : 0 -> 2^n - 1
for j : 0 -> n - 1
b[ S - j ] <- min(b[ S ], b[ S - 2^j ])
for i : 0 -> n - 1
for j : 0 -> n - 1
dis[ i ][ j ] = b[ 2^i + 2^j ]
继续优化,我们考虑询问能不能也优化成一个集合,设
T4
朴素
转移
其中
这个
观察状态,虽然集合有
考虑怎么优化,我们发现转移式子
当然,为了方便实现,我们直接改
设
最终
虽然能过,但还可以更猛一点
我们
因此,只要设
杂题讲解
- 容斥:没有不满足条件的方案数:
其中
-
无向图求哈密顿路径方案数
空间状压开不下了
我们把哈密顿路径的定义拆开:找一个路径,每个点恰好经过一次
恰好很难办,转化以下:找一个路径,每个点至少经过一次,路径长(这里是经过点的个数)为 方案数
找一个路径,每个点至多经过一次,路径长(这里是经过点的个数)为 方案数
容易发现这两个都是满足哈密顿路径的性质的
我们思考至多一次反义词为超过一次;至少一次的反义词是没有一次;显然后者更好做,因此我们枚举哪些点没有被碰到,然后 。设 表示以 结尾,路径长为 的方案数。转移枚举下一个点是什么,转移复杂度 -
loj575
排列是一个很困难的东西,为了解决排列有以下几种方法:- 考虑相对大小
- 容斥
- 把
优化为
这题后者,我们考虑如果只有 怎么做,太显然了;然后考虑枚举哪些 不满足条件,剩下的随意。发现方案数和 的长度有关系。具体的,假设长度分别为 ,答案为
可枚举哪些 不满足还是太困难了, 考虑 ,设 表示考虑前 个数的方案数, ,其中 为 之间 的个数,表示这些 被强制扭成
-
内向树拓扑序数量
每个点应该是子树内最后一个点,因此答案要除以
因此总方案数为 -
再谈P4099 SAO
我们把 和 内向树拓扑序计数 缝合一下就可以了。钦定一些朝下的边不满足,剩下的随意,这棵树就变成了一个内向森林,答案即为
太暴力了,再考虑 优化容斥。我们发现 是我们想要的,因此设 表示以 为跟,子树有 个点方案数(带容斥系数)。- 对于一个
的边,显然的树形 合并, - 对于一个
的边,我们判断这条边是否翻转。- 若翻转,
(注意容斥系数) - 若不翻,
- 若翻转,
- 对于一个
个点 ,玩家初始在 号点,初始能量为 ,每次只能走到自己没走过的、比自己能量小的点,并让自己能量加上这个点的权值,方案数。
我们考虑
我们发现以下性质:
- 编号不重要,没有一个限制条件和编号有关
的点不用考虑,没有用- 能量
时随便选 - 最多要考虑的只有
个数 划分成可重集和的方案数为 级别
因此我们可以
-
当朴素
不可做时考虑换角度……不如说是"方向"来
P4766
首先的思路要参考 ,考虑按时间从前往后朴素 ,但发现他多了一维 ,不可做
参考线段树分治的思路,发现按时间 是困难的,我们试一试换个方向,从左往右按距离 ,这有什么好处呢?因为距离最远的外星人必须被炸掉,而如果他炸掉了必然会波及当前时间存活的所有距离近的外星人,而当前时间死亡的在上面区间处理,当前时间没有出现的在下面区间处理
设 表示消灭出现时间和消失时间在 内的外星人全部消灭的炸弹距离和 -
给
,构造值域在 的严格单增的 ,使最大化我们先像一个朴素
,设 表示前 位,上一个 值为 答案,复杂度
我们发现如果我们从前往后 ,因为 单增,我们不可避免的要记录上一个 的值。怎么办呢?我们考虑从左往右
这里从左往右是指把下标当做前后, 的值当成左右。既然有二进制当然考虑的是 的二进制,发现在考虑第 位时,如果前 位是相同的,则第 位一定是前面一段是 ,后一段是 ,这不就是一个区间 了吗 -
树形背包是
的原因:两个点 ,只会在他们的 合并一次,最多 个点 -
先考虑如果你已经有了一个排列,怎么判断是否可行。显然的,
越小越好,因此贪心即可
用排列的第三种优化方法,朴素状压,记录 表示考虑了集合 ,上一个 最小为 ,上一个 时 ,所有 的和是 ,复杂度老师曰:
要想去掉 的某一维有几种方法:
1. 可以通过其他的数推出他的值
2. 他产生的影响可快速计算
3. 贪心性质,这一维没有必要这时候用的第二种方法。考虑整数划分的优化方法,发现如果一个位置
限制了一个值,后面的都要限制住这个值,不如直接把这个值在后面减掉 -
给
,求多少 满足数学奥数题
你拆开更难算
有个东西叫平方差公式
原式等价于 -
这个题用的就是排列的第一种处理方法:考虑相对大小
我们发现如果直接填数的话是困难的,因为你不知道前 个数填什么,因此我们考虑把一个数插入到某个位置,然后让这个位置后面的数 ,这就是离散的状态设计方法
我们设 表示前 个数中有 个数比上一个标记的数要大的方案数。可以知道 。每次转移时,我们需要考虑 在原来的数中的排名- 当
比我们这次标记的数要大, - 当
比我们这次标记的数要小,
- 当
-
AGC032D
这个问题很像CF1839D Ball Sorting
考虑弱化版,若 怎么办,我们可以钦定里面一段上升子序列不变,剩下的移动。显然取 最优
虽然 时 的性质显然不满足了,但我们可以知道基本思路。设 表示前 个数取以 结尾的上升子序列时答案,递推显然,复杂度 -
P8321
处理请去掉他们,因为计数是不能有这些东西的
我们考虑把 合并后从大到小排序,我们就相当于找所有 与 匹配,答案为两者靠后的一个
这就很像P8863,我们设 表示前 个数, 向后牵 根线, 向后牵 根线,转移显然。发现我们可以优化掉一维,因为假如我们知道前 个数中 的个数为 , 的个数为 ,则可知
技巧小节
- 利用容斥原理将全部满足转为钦定自己不满足
- 在合适的时间计算贡献以减少对后续状态的影响
- 以合适的方法排序以获得好的性质
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?