Atcoder 题目选做(四)
1. [AGC059C] Guessing Permutation for as Long as Possible
给定
个 中的二元对的顺序,求有多少个 阶排列 使得按顺序询问到每个 之前无法确定 大小关系。 数据范围:
。
考虑一个询问
手玩可以发现大部分这样的路径长度都为
否则不妨考虑路径的一部分
那么我们只要对于所有
建立 2-SAT 后统计解数量即可,这个 2-SAT 只有相同或不同关系,可以直接并查集。
设 2-SAT 图联通块数量为
时间复杂度
2. [AGC059D] Distinct Elements on Subsegments
给定一个长度为
序列 所有长度为 的子区间的颜色数 ,构造原序列或报告无解。 数据范围:
。
显然考虑差分
分别记为
考虑如何刻画
那么存在一种排列
通过观察可以猜测我们在
然后考虑通过
我们只要构造一组合法的
显然
容易猜测取
最后只有
那么贪心来说肯定把
时间复杂度
3. [AGC059E] Grid 3-coloring
给定
矩阵 ,其最外圈的 个格子已经被 染色,问中间部分能否 染色。 数据范围:
。
题目的限制我们可以看成一个
对于最外圈的值,还原
如果这个环最终相邻元素差
进一步的还有显然的限制:
对于这个问题,显然我们只要考虑对边上的两个点,并且只要考虑
可以证明满足这两个条件后总能从外圈构造出合法矩阵:
首先能够证明
然后对于任意两个邻居,容易发现每个元素变化量
那么可以证明相邻两个数差一定
因此只要判断能否成环和对边是否满足条件。
时间复杂度
*4. [AGC059F] LIDS
求有多少
阶排列 满足 且 。 数据范围:
。
先考虑只有第一个条件的情况,考虑用杨表刻画:那么该排列对应的杨表就是只有一行一列的杨表,可以根据钩长公式算出结果,然后把两个同形态杨表和一个排列双射得到:
考虑另一种方法刻画这些排列:
画出一个
网格,那么不在边界上的格线横纵各 条。 选定一个
和分别 条横纵格线,按横格线从上到下,纵格线从左到右的顺序匹配,得到 个匹配相交格点(记为红格点)。 对于剩下的
条横纵格线,按横格线从上到下,纵格线从右到左的顺序匹配,得到 个匹配相交格点(记为黑格点)。 对于一个红格点,如果其左上部分没有黑格点,那么染红他左上方的格子,如果其右下部分没有黑格点,那么染红他右下方的格子。
对于一个黑格点,如果其左下部分没有红格点,那么染黑他右下方的格子,如果其右上部分没有红格点,那么染黑他右上方的格子。
如果有
个格子被染色,可以证明一定是 个格子被染色,把剩下来的一行一列的交点染色。
一种可能的操作方式如下图:
通过观察和手玩可以证明如下事实:
- 红格子纵坐标递减,黑格子坐标递增。
- 红格点构成的折线和黑格点构成的折线至多一个交点。
- 最后一步前有恰好
个格子被染色。 - 对应生成的排列
。 - 任何一个合法的排列都能还原成这样的一个矩阵。
那么我们就把
那么考虑有多少种方法使得
假如该格子被左上方的红格点染色。
那么不妨假设前
那么我们要使得右下方没有黑格子,那么右侧
那么右下方至少要选择
类似如果我们要让
然后考虑
那么这要求红格点都在
即在上面的基础上要求右下方恰好选择
那么依次计算组合数即可。
时间复杂度:
5. [ABC275G] Infinite Knapsack
给定个
个物品,每种无穷多个,有两维代价 和收益 , 表示 分别 的情况下最大的 ,求 。 数据范围:
。
先求出每种物品的“性价比”
那么答案可以表示为
那么我们只要求
如果存在
考虑把这些向量画在二维平面上,那么很自然的发现我们只要最靠近第三象限的两个向量(二、四象限各一个)。
具体来说就是
判断这些向量过第三象限得到那个夹角是否
时间复杂度
6. [ABC275Ex] Monster
给定
,令 区间 的代价是 ,求令所有 的最小代价。 数据范围:
。
考虑线性规划,设
设对偶变量为
这就相当于可以选择若干
看到区间最大值很自然想到笛卡尔树,我们发现有意义的限制一定是笛卡尔树上的极大区间,那么我们只要限制每个
那么就可以树形 dp 了,
注意到
可以用闵可夫斯基和维护,每次归并差分数组,注意到初始态每个点差分数组都是相同的一段,把所有斜率相同的连续段用优先队列存下来,转移时先启发式合并,然后弹掉最小的若干段使得总长
时间复杂度
7. [AGC060C] Large Heap
给定
,随机生成一个深度为 的小根堆,权值为 的排列。 求第
层最左边节点 值小于第 层最右边节点的值 的概率。 数据范围:
。
先考虑有多少个深度为
考虑如何用类似的过程解决原本的问题:我们把
每次我们取出
那么考虑用 dp 维护这个过程,
转移时枚举上一步加入的是
展开所有组合数并化简可以得到:
边界条件
时间复杂度
8. [AGC060D] Same Descent Set
求有多少个
阶排列对 使得 恒成立。 数据范围:
。
定义排列
设
那么设
根据容斥原理我们有
最后几步的组合意义是:已知
根据
注意到此时一个
因此设
设
答案为
时间复杂度
*9. [AGC060E] Number of Cycles
记
表示排列 形成的环数。 给定
阶排列 ,构造排列 使得 。 数据范围:
。
设
因此
先考虑
假设最大值在
时取得,那么每次交换 使得 变大, 一定不降,那么一定有一组最大值在 时取得。
因此
接下来考虑
- 对于每个
,选择一个没有入度的 使得当前 在当前 中不连通,且 在当前 中不连通。 - 注意到这样的操作至多导致两个
不能选,因此对于 ,这样的 总是存在。 - 对于
,我们至少可以选一个 使得 在当前 中不连通,这一步至多导致 个环。 - 对于
至多导致 个环。
因此
此时
设
那么我们只要在这
注意到每次
时间复杂度
*10. [AGC060F] Spanning Trees of Interval Graph
给定若干
的子区间,其中区间 共有 个,每个区间对应一个节点,两个节点连边当且仅当他们对应的区间有交,求这张图的生成树个数。 数据范围:
。
设共有
设
注意到这里我们考虑了自环的贡献,但是此时
显然直接维护该行列式不太可能。
考虑矩阵行列式引理:
事实上对于
带入原题,我们要分解
因此我们只要解决分解问题即可。
注意到
那么我们用
那么对于
此时暴力求行列式的复杂度为
考虑每个区间
可以看成有
每个区间对
时间复杂度
11. [ABC276Ex] Construct a Matrix
给定
的 012 矩阵 , 个限制要求 子矩阵的元素乘积 ,构造一组解。 数据范围:
。
先处理
否则可以看成
那么可以用异或方程组解决,但是变量有 std::bitset
优化高斯消元即可。
时间复杂度
12. [ABC277Ex] Constrained Sums
构造
满足 个限制: 。 数据范围:
。
首先可以考虑 2-SAT 模型,
那么可以用前后缀优化建图,记
时间复杂度
13. [ARC158D] Equation
次询问给定 ,构造 使得: 数据范围:
。
注意到左右均为齐次多项式,且次数恰好差
不断随机
感性理解不合法的
时间复杂度
14. [ARC158F] Random Radix Sort
给
个十进制 位数, 次操作,每次选一个位 ,按第 位上的值从小到大进行稳定排序。 求最终让
变成 的方案数。 数据范围:
。
首先同一个
对于一个长度为
接下来只要考虑一些排列是否合法即可。
由于基数排序不改变值相等的数的相对顺序,因此我们能知道
对于每一对
显然为了保证他们的相对顺序,我们要求所有
但这并不够,如果
然后就可以 dp 了,从后往前考虑排列
加入
最后统计答案类似,维护所有
第二类斯特林数可以用容斥原理暴力算。
时间复杂度
15. [AGC061B] Summation By Construction
把一个
的完全二分图分成 条简单路径,第 条长度为 。 数据范围:
。
先考虑
在邻接矩阵上划分路径,我们可以构造出得到如下的阶梯型结构:
我么可以把这个
把每个阶梯拆成大小为
然后考虑
我们能划分成一个长度为
把这些长度为
剩下的六个空位放
时间复杂度
16. [AGC061C] First Come First Serve
给定
构成 的排列,且 。 令
,求 的相对顺序有多少种可能。 数据范围:
。
对于一对
因此我们可以用 dp 容斥掉这种情况,
那么
双指针求解即可。
时间复杂度
17. [AGC061D] Almost Multiplication Table
给定
矩阵 ,构造单调递增数列 最小化 。 数据范围:
。
先二分
不妨假设
- 从小到大考虑
,将 与 和 取 。 - 从大到小考虑
,将 与 和 取 。 - 如果
或 无解,如果当前 合法那么结束。
然后交换
感性理解一下这个算法的正确性:首先我们每次都进行了尽可能少的调整,那么
然后分析一下复杂度,我们时刻都有
由于
复杂度
*18. [AGC061E] Increment or XOR
给定
,以及 个操作 ,你可以进行如下操作:
代价为 。 代价为 。 求让
从 变成 的最小代价。 数据范围:
。
考虑观察结构:先看最高位
那么观察第
不断递归,我们可以大概得出一个子结构:
先考虑边界条件:
每次转移
如果没进位,那么要求
如果有进位那么相当于
注意到转移形式类似最短路,Dijkstra 处理即可。
时间复杂度
*19. [AGC061F] Perfect Strings
定义一个 01 串是好的当且仅当串中 1 的个数是
的倍数,0 的个数是 的倍数。 求有多少个好的 01 串使得他的任何一个子串都不是好的。
数据范围:
。
把 01 串看成格路,
那么我们要求的就是经过
看成在
假设我们枚举所有起点,那么终点确定,且由于路径互不相交,那么所有起点从左上到左下再到右下按顺序与终点从左上到右上到右下按顺序匹配。
注意
那么这个问题就很简单了,只要做一次 LGV 引理就能解决,但是注意 LGV 引理对应的行列式为有符号
接下来要处理原问题,主要问题就是要处理某些起点终点可以不选,还要统计起点中横向纵向的数量。
那么我们把这样可以跳过的起点直接连向终点,剩下的起点如果是横向的就把权值
具体的转移网格构造出来如下图:
可以验证加入若干个直接匹配的排列,依然不改变每个路径的逆序对数,符号依然是
那么我们只要求出这个网格图上对应 LGV 引理矩阵的值,由于答案是一个二元生成函数,那么我们可以用拉格朗日插值优化,带入
时间复杂度
20. [ABC278Ex] make 1
一个非负整数序列
是好的,当且仅当 存在一个非空子序列 ,满足 中所有元素的异或和为 。 有一个初始为空的序列
,以及 张写着数字的卡片;卡片上的数字取遍 中的整数。你可以自由选择一张卡片,将这张卡片上的数字放在 序列的末尾,并删除这张卡片,以后不能再选择它。你会一直进行这个操作,当 成为好的序列后停止。 给定
,求停止操作时长度为 的不同 序列数。 数据范围:
。
考虑一步一步解开题目的限制。
首先不断插卡片的过程相当于限制
首先我们可以容斥,设
然后考虑反面考虑
那么进一步我们要处理掉元素各不相同的限制,可以设
那么
那么我们只要求出
第二个问题是经典的,直接用倍增和多项式平移求出
而
一遍卷积即可。
时间复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】