杂题乱写
CF734E Anton and Tree
一棵树的节点有黑白两种颜色,每次操作找到一个同种颜色的联通块,将它的颜色翻转,问将树操作至同色的最小操作次数
由于对一个点操作一次就可以将其周围的颜色相同的点全部变色,所以不难想到将相邻颜色相同的点缩成一个点
这样就能新建出来一棵邻点颜色不同的树
无论从哪个点开始变色,最优方案都是直接向外扩展变色,那么不难想到最优点应该在树的直径的中点上,这样向外扩展的点数和次数都是最多的
设新树上直径为
CF618E Robot Arm
考虑用线段树维护每条线段所对应的 向量(即终点和起点的相对位置)
由于向量可以平移,那么就先将所有线段的起点平移到原点,设平移后终点坐标为
对于操作
所以直接将第
对于操作
在线段树上打一个旋转角的
由于向量可以平移,那么将每次操作后得到的线段重新收尾相接相对位置不变,且最后一条线段终点坐标为所有向量相加
每次答案即为线段树根节点的值
CF521D Shop
如果只考虑操作
这样可以考虑将操作
有个贪心的想法就是操作一定是按
首先考虑操作
贪心地想也肯定是从大到小去选,所以也要排序
这样的话对于每一个位置的每个加法操作的前提都是这一个位置上再它之前的加法操作都被选了
即对于每个加法操作,都是把某个值为
这样就可以直接把一个加法操作看成
简单证明一下排在后面的加法,转化为乘法后肯定也没有之前优,即上述提到的 对于每一个位置的每个加法操作的前提都是这一个位置上再它之前的加法操作都被选了
设
移项,有:
显然成立
思考如果转化为乘法排序之后一个操作
由于乘法是具有交换律的,因此可以把那些操作提到所有操作
接下来考虑操作
显然对于每个位置操作
然后对于每个位置的操作
这个也不会打乱顺序进行
P4755 Beautiful Pair
挺套路的一道题,之前模拟赛考过两边这种套路
直接枚举最大值
考虑启发式分裂,选取小的那段区间去枚举,设其为
离散化之后直接建一棵主席树就行了
细节就是注意小数的取整和取整后它在离散化数组里的位置的问题
启发式分裂一个
为啥这么套路的题还写出来因为学到了这个东西叫启发式分裂
P4833 萨塔尼亚的一生之敌 / P3452 [POI2007]BIU-Offices
给定一张
个点 条边的图,求补图的连通块个数以及各个连通块的大小
有个
发现只需要知道每个连通块的信息,所以可以考虑建出生成树
考虑
可以直接用链表直接维护出来这个
这样每个点在链表中只会被遍历一遍,且这么做枚举仅涉及到树边,而对
P5307 [COCI2019] Mobitel
给定
的矩形,每个格子有一个正整数,从左上角走到右下角每次向下或向右走,求路径上乘积不小于 的路径条数
有个
空间显然开不下
发现根本不在乎这个乘积是多少,在乎的是乘积是否
由整除分块的理论,
将第三维离散化,第一维滚一下即可
CF1408H Rainbow Triples
给定一个长度为
的序列 ,找出尽可能多的三元组
给定长度为的序列 ,找出尽可能多的三元组 满足:
互不相同
- 所有的
互不相同
输出最多可以选出多少个三元组,多组数据
nb 题
设
考虑以第
根据答案上界,
如果
那么原问题就弱化为了:
不难发现若这个弱化问题的答案
对于弱化问题可以网络流求解:
源点
直接跑最大流和答案上界取
但是
由于最大流
发现割去的边一定是一段前缀
具体的话就是建一棵线段树,以割去的后缀
对于一个颜色
然后枚举割去多少前缀
时间复杂度
P7054 [NWRRC2015]Graph / 2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest G Graph
给定一张
个点 条边的 ,可以至多添加 条有向边,使得这仍然是一个 且字典序最小的拓扑序的字典序尽量大,输出这个拓扑序以及方案
如果没有加边操作那么直接用一个小根堆维护入度为
考虑加边操作,对于现在的小根堆堆顶,一定是想要加一条边从而让它不出现在字典序的这一位,而又想在这个位置放一个字典序尽可能大的数
发现要加的这条边到底和谁连,可以暂时不关心
那么开一个小根堆
尝试将
若
否则
这样操作一轮之后,若
最后将当前答案的儿子入度全减一,若入度为
[AGC014E] Blue and Red Tree
给定一棵
个节点的树,一开始所有边都是蓝色的,每次选择一条所有边都是蓝色的路径,删掉其中一条边,然后在路径的两个端点之间连一条红边,求最后能不能得到目标形态(都是红边)的树
将输入的红边看作对路径的覆盖,那么每次应该取的是只被覆盖一次的蓝边,这样不会对别的路径造成影响
那么做法就是找到被覆盖次数恰好为
不断重复直到所有蓝边都被删去,若过程中出现没有被覆盖一次的蓝边就是不合法
用线段树维护,节点记录覆盖次数的最小值,这条边是哪条边和覆盖它的红边编号的异或和
维护异或和是因为这东西比较好删除,再异或回去就行了
CF1316F Battalion Strength
给定一个长度为
的序列 ,定义一个序列的权值为原序列排序后相邻两项积的和,现在从中随机选取一个子序列,每个子序列被选到的概率相等,问取出的子序列的权值的期望时多少,动态带单点值修改
首先发现这个序列是假的,可以直接排序做来考虑两个数的贡献
两个数做出贡献当且仅当这两个数被选且它们中间没有数被选,所以答案为:
然后这玩意要带修,考虑线段树,看它要维护点啥
若两段区间合并,那么有:
设
CF1580D Subsequence
给定一个长度为
的序列 ,定义一个序列的价值为:
其中
要从中选择一个长度为
的子序列,最大化选择子序列的价值
把式子拆一下,有:
发现后面每个
发现这玩意很像树上两点间距离,于是把笛卡尔树建出来,每条边的权值是两个节点的权值差,答案就是选出
P5643 [PKUWC2018]随机游走
给定一个起点
,和一棵 个节点的树,多组询问,每个询问给定一个点集 ,求一个人从 随机游走,到达过 中的全部点期望时间
依旧考虑
不难想到把这道题的问题当做
设
一般是高斯消元来搞,但是这样做时间复杂度会爆炸,所以考虑线性递推
设
然后就可以
设
这是个或卷积,直接
时间复杂度
CF1137E Train Car Selection
给定一个初始有
个 的序列 , 次操作,操作有三种:
- 在序列开头加
个
- 在序列末尾加
个
- 给序列的第
个位置加上
每次操作过后输出当前序列中最小值位置和它的值,若存在多个最小值则只考虑位置最靠前的
首先不难发现每次加进去的一组
若在前面加一组
考虑在后面加一组
那么有:
所以维护一个左下凸包即可
对于操作
那么这个操作就是增加标记
可能操作完之后凸包会翘起来,再将翘起来的点删掉即可
要注意操作
CF1578L Labyrinth
给定一个
个点 条边的无向连通图,每条边有一个限制 ,每个点有一个权值 ,每到一个点可以选择是否将自己的体重加上点权,一旦体重超过边的限制就不能通过这条边,问最大的初始体重,使得从 号点出发且能吃掉所有糖果
不难发现走的路径一定在最大生成树上
然后发现它的走的策略是:对于当前树上最小的边,一定是先加完一边子树的所有权值,再走过这条边,再加完另外一边子树的所有权值
证明就是如果考虑一种走法使得从两边反复横跳加权值,那么则当前体重一定不超过当前树上最小的边,这样的话先加完一棵子树肯定是不劣的
建最大生成树的时候建出
CF1575M Managing Telephone Poles
给定一个
的棋盘,有一些关键点,问每个点到最近关键点的距离和
先假设答案在左上方
设
按照斜率优化的套路把它改写为:
最小化截距,斜率单增,单调队列维护右下凸包即可
剩下的三个方向可以通过转坐标系来变成这种情况
CF338E Optimize!
给定一个长度为
的序列 和一个长度为 的序列 ,求有多少个 使得 和 能一一匹配,两个数 能匹配当且仅当
不难发现匹配一定是将
那么问题可以转化为:对于
将序列
那么问题变成了区间覆盖,询问序列
将第
直接线段树维护即可
CF338D GCD Table
有一个
的表, 行 列的值为 ,给定一个序列 ,问是否存在 使
由于
发现
同时还能发现
这是个同余方程组,直接
然后这样做只满足必要性不满足充分性,所以还要代回去验证
CF258D Little Elephant and Broken Sorting / AT4513 [AGC030D] Inversion Sum
给定一个长度为
的排列 ,有 次操作,每次操作以 的概率执行交换 ,问 次操作之后逆序对的期望
由于期望具有线性性,所以可以考虑每一个位置对对答案的贡献最后加起来
设
答案为:
P3349 [ZJOI2016]小星星
给出
个点 条边的无向图和一棵 个点的树,现需要给树上每个点 安排一个映射 ,满足对于树上任意边 ,均有边 在给定的无向图中,要求 为一个排列,求方案数
有一个
转移就枚举补集的子集转移,时间复杂度
发现枚举子集咋样都优化不下去,所以可以考虑不枚举子集,用子集反演来搞
设
由子集反演,有:
考虑计算
则:
时间复杂度
P4865 Samcompu Loves Water
如果没有失效的跳转方式的话就将边从小到大排序,不断加边,方案数就是两个连通块大小相乘,用并查集维护一下即可
算答案就先离线按照时间排个序,若在加边前危险程度大于时间就直接把当前的总方案数
考虑加上失效的跳转方式
由于不同失效的跳转方式最多只有
CF1163F Indecisive Taxi Fee
给定一个
个点 条边的无向图,每条边有边权,有 次询问,每次询问给定一对 ,表示将 这条边的边权修改为 ,求 的最短路长度,询问相互独立
首先跑一遍
-
修改的边在
的最短路上,边的长度变大了 -
修改的边在
的最短路上,边的长度变小了 -
修改的边不在
的最短路上,边的长度变大了 -
修改的边不在
的最短路上,边的长度变小了
后三种都很好写,直接
考虑第一种情况,发现答案就是
现在就是要求出不经过某条边的最短路长度
对于一个不在原最短路上的边
设
维护一棵线段树,下标为原最短路上边的编号,值为不经过这条边的最短路长度
枚举每一个不在原最短路上的边更新即可
CF431D Random Task
设
由于
所以可以二分,数位
P3544 [POI2012]BEZ-Minimalist Security
给定一张
个点 条边的无向图,每个点有点权,每条边有边权,满足点权和边权都非负,且每条边的权值小于等于两个顶点的权值和,现在要将每个点减一个数,满足非负且小于等于点权,使得每条边权等于两个顶点的点权和,问最大修改代价和最小修改代价
设
将式子移项,有:
等号右边这一串式子是个定值,所以只要确定了一个点
那么一个连通块的答案为
具体做法是将连通块内任意一点代价设为
如果没有访问过当前点,那么就用
如果已经访问过当前点,那么联立解方程组,判断有解,无解和无数解
-
无解:直接返回,输出
NIE
-
有解:将
求出,然后代回逐一验证是否可行 -
无数解:因为限制了
,所以 bfs 后,联立来解一个不等式组求交集,然后取端点值代入求得最大值和最小值
AT2705 [AGC019F] Yes or No
不难想到最优策略是哪个多就选哪个
画一个坐标系,横坐标表示未猜 yes
的数量,纵坐标表示未猜 no
的数量
从
首先一定能猜中
由于期望的线性性,考虑每个在
经过一个点的方案数为
最后再把稳了的
CF1503E 2-Coloring
盗个图
不难发现合法的染色方式都如上图所示
然后就是要数这个玩意
可以枚举一个峰的高度和两个峰的位置来计算,其中设
其实就是数路径,第一个组合数是从左上走到
第二个组合数是从
然后因为强制了,所以最后
这个直接算是
可以用前缀和优化到
数蓝色的话就将
[AGC013E] Placing Squares
给定一个长度为
的木板,在若干整数位置断开将它分为若干段,要求其中 个位置不能成为断点(称为标记点),定义一种划分方案的贡献为最终所有线段长度乘积的平方,求所有方案贡献之和
组合意义天地灭,代数推导保平安
设
考虑优化,假设
设
假设已经知道了
显然可以矩阵快速幂优化,那么是不是关键点的转移矩阵分别为
P4900 食堂
多组询问,求:
其中
表示取小数部分
转化一下,题目就是要求:
前一部分就是求:
设
对于后一部分考虑
其实等同于求出小于等于
扩展到求和就是求小于等于
也就是说,对于每一个数,它对这个答案的贡献就是它的因子个数
那么直接线性筛约数个数即可
[AGC010F] Tree Game
先考虑简单的情况:
假设棋子放在
将情况变难一下:
假设棋子放在
将情况再变难:
假设棋子放在
假设在
假设
这样就回到了上一张图所讨论的情况,此时先手必胜当且仅当
那么做法就是枚举所有点作为根,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】