Day1
T1
题意:给定 ,求 进制下 的各数位上的值之和最小值。
多组询问,。考虑先暴力计算 的进制下最小值,不难发现2进制下答案最大 ,于是在更大的进制下 只有最多三位甚至两位,形如 ,这个你可以在已经有的答案下枚举数位然后解两个方程得到。
T2
题意:给定一棵树,有 条线段以一定覆盖,一个点可以不断走到和其有同一条线段共同覆盖的其他点,求期望在几个位置赋值可以走到所有点。
先考虑链,发现显然。于是直接上树,设 表示 子树内全部赋值的期望代价,那么每次转移只需要看 和其儿子 的连边有多大概率被覆盖即容易转移。
线段覆盖可以树上差分。注意概率是0的要特判。
T3
题意:给定有根树,每个点有一个限制 表示其子树内必须有正好 种颜色。全局有 种可用。保证 。有一些 ,表示没有限制。
考虑把 干掉。显然一个 -1 可以把他所有儿子挂到他父亲上然后把这个点看成 。设 是染色方案。
然后容斥,考虑 表示使用最多 种颜色的答案,那么就有
则
发现是 的。
但是不同的 最多只有 个,可以合并起来快速幂。毛估估一下复杂度大概
T4
你直接把每个位置的 所能覆盖的 , 看成线段覆盖到线段树上,每个节点维护堆存这个东西也方便求最大值,然后每个节点维护原 的最大值和线段的最大值,然后每次询问合并即可。堆的性质使之可以懒惰删除,即删除只需要等更新节点的时候发现删掉的就一直pop。注意随时更新答案和堆以免出锅。
题意:给定序列,最多删 个点,每个点可以跳到它后面 的点, 次询问从 点最少几步能跳到 。询问独立。
考虑倍增。设 表示从 出发,跳最多 步,删最多 个点,最远能跳到哪里,则容易看出转移:
然后中间的取 max 你可以上个 st 表或者 ds 什么的优化一下。
最后考虑类似倍增LCA的方法,从大到小找到差一步到 的步数。你设一下 表示你考虑第 个询问起始点出发,现在考虑到 的步数,删除 个点最远能到哪里。注意再记一下每个状态现在跳了几步。
转移大概是
也需要稍微 ds 维护一下。
Day2
T1
题意:给定长度 的序列,有一种类似双闭二分的查找,目标随机,要求你求出某种策略,使期望查找次数尽可能少,输出期望。当然,有一个阈值 ,当你的询问次数大于 的时候你会不计算他进期望。换言之,你需要求出最小的查询次数不大于 的查询次数平均数。
注意到你用纯二分去做,答案是 级别的。
考虑这个类二分就是二叉树的中序遍历,于是题意变成了构造二叉树。
然后你二分一个答案 ,对于不大于 的深度,你贪心能塞多少塞多少,塞成满二叉树,然后对于大于 的深度,你塞成一条链,显然这样最优。你判断下这样所有深度不大于 的平均数是否满足答案即可。
T2
转化题意:给定树,边有权,用所有点构造一个权值最大的环,环的权值就是相邻点树上带权距离之和。
不难发现对于一条边,他最多会被两侧子树大小较小的大小*2次经过,经过构造证明容易看出对于每一条边都是这样的。
T3
题意:给定序列 ,其中 ,次询问可以进行 次操作使得某个位置减一,任意时刻不可以小于0,求最小的 。
先离线询问排序。
考虑相同颜色缩成一段,不妨称其为有序三元组 表示 这段极长相等连续段长度是 ,那么显然对于这段,其可以用 的代价使答案减二,知道其和 权值相同。
同时不难发现这玩意只关心左右端点的信息,于是维护一个堆和链表即可。
T4
有两种操作,各 个,一个是花费 将 减一,另一个是花费 将 减一, 加一。
首先转化,设 是只把 位置减一的最小代价,初始 。
容易看出这玩意和最短路像啊,很像啊,于是用 dij 的思维每次取出当前最小的 去更新答案。
发现唯一的小问题在于如何求出某一个 固定后会新使得哪些区间覆盖的位置的 全固定了,这个可以经典线段覆盖,将一个操作区间拆成 段区间放到线段树上,记一下这个区间的个数,然后每次线段树上一段区间全部都固定了就把覆盖的区间的计数器减一,如果减到0了就用这个去更新答案。
更新答案可以树状数组。
最小表示法(?)
分析复杂度:有 的一张无向图,有 种颜色,求出所有本质不同的状态数。
考虑一个点的本质颜色不超过 ,即前面出现过的最大颜色加一。这样搜一下发现是 级别的。
搜索
给定01串,删除长度为 的串的第 个位置有 的概率,一个有 个 1 的串代价是 ,求删 次直到空过程中所有过程串的代价和的期望。
考虑搜索每一个串的总的期望代价,则通过记忆化发现复杂度是串的所有本质不同子序列个数,这是 的。
卡常:
一般 1e9 两个数相乘是 1e18,ull的范围是17e18左右,所以可以累加17次取模一次,大幅减小常数。同理,加的数比较小可以最后一起取模。
Day3
T1
题意:有长度为 的序列,有两个位置 ,集合 满足 ,求集合的大学。则不难发现所有 倍数都在集合中。
T2
题意:有 次操作,要么加入一个数,要么删除一个数,要求按大小排序后找到分界线,使两侧的和的差最小,求最靠右的最优分界线。
可看成冰火战士弱化版,树状数组二分或者线段树二分即可。
T3
题意:有一个 个点, 条边的无向图,每条边有权值 ,求 到 的路径,最小化 ,输出最小值。
做法:你考虑找到以 跑最短路和 跑最短路,然后把他的答案放到二维平面上,容易发现其更优决策点在两个答案中更优的一个对应的反比例函数下,由于其下凸,所以也就是在这两个决策点的连线下面。于是你只需要找到在直线下面距离直线距离最远的一个决策点,没有就不管了,有就分成两条直线分别递归。
这个题改编自一道最小乘积生成树,二者几乎一样。
T4
题意:有两个串 ,。所有长度为 的以 为一个子序列的串按字典序排序编号,求编号比 大 的串。保证 合法,保证有解,。
首先容易 dp 得到 的编号,然后从后往前填每一位即可。
Day4
T3
题意:求长度为 的所有错排的逆序对数之和。
解法1:OEIS。一群鬼人靠这个过穿了。强烈谴责。
解法2:设 是长度为 的错排数,通过容斥以及寻找 和 的关系,有递推式 。考虑计算双射权值(这里为了描述,位置就是下标,权值就是数组权值) 对答案的贡献。不难发现当 没有一个在位置 上的时候,交换两个数与否都是错排,且只有一组贡献一个逆序对,于是这部分答案就是满足这个要求的错派答案除以2。当 在位置 上时,不难发现这样的错排数有 个,且贡献答案是 。当只有一个在位置上的时候,需要讨论。
不妨设 , 在 的位置上,设 在位置 ,位置 上的数是 ,那么不难发现,当位置 在位置 和 左侧或右侧而不是中间时,你通过交换 可以得到另一个错排,所以这部分也是一半的贡献。
最后只剩下位置 在位置 中间的情况。这种情况,你可以任选三个位置 ,然后分类讨论,当 时,错排数显然是 ,否则你显然交换权值 显然仍是合法错排,交换后错排数就是 。
于是整理柿子,答案是
T4
要求支持对一个字符串 支持修改子段为给定串 ,查询子段中可重出现过多少次给定询问串 。
,询问次数小于 。
直接bitset维护每个字符在 中出现位置然后暴力算即可。
复杂度
CF1550F
傻逼题。你考虑转化成求每个点最小需要多大的 到达 。于是就变成了一张无向完全图,边 的边权就是 ,然后你就别乳卡。发现问题在于如何维护这个最小边,发现容易把所有点放到 set 里二分维护。因为一个连通块里的点不考虑,你找一个连通块的最小边时把这个块从 set 里暂时删掉然后二分即可。
SDOI2013 直径
傻逼题*2。随便找一条直径,找到他上面任意一个非端点,然后以它为根 dfs,对于其中深度最深的一个节点所在的根的子树,子树中所有深度等于他的点的LCA是所有直径的交的一个端点,另一个端点是剩余所有根子树中深度等于深度较浅的直径端点的点的LCA。
CF1149D
妙妙题。考虑最小生成树中,若有一条路径上的边全为 ,则 边必然不可能被加入。于是先用 边求出所有连通块。然后最小生成树没有环,所以我们不能从一个连通块出去再回来,于是我们可以从1开始状压dp记录经过连通块。
然后发现对于点数小于四的点集,我们不可能进入再回来,所以只需要状压这部分,设 表示当前在第 个点,经过集合是 ,然后容易类似最短路转移。
P7516
做过的题。考虑题目让你求的是什么。能够看出,对于一个点对 ,只有其经过编号不小于 的点可以互达才能计入答案。于是你可以设 表示 能通过不小于 的点到 的基础上最多只用最后几条边才能到达。
然后从大到小枚举每一个点去转移,将答案计入 即可。
Day5
T2
题意:要求支持每次加一条边,任意时刻查询一个连通块中最大异或和路径。保证任意时刻都是森林。
傻逼题。暴力启发式合并用 维护到根的路径异或和即可。
带环就变成了WC的那个典题。
T3
二分图博弈。
结果显然要么没人抢,要么只有一个人抢到。显然当别人抢不到他的时候他才会抢。这个和二分图博弈大概是等价的。
发现求出最小编号的一个点必然在一个最大匹配中那么他就可以抢了。如果不存在就抢不了。这个可以先建二分图跑一个dinic然后在残量网络上tarjan求出所有可能在最大匹配中出现的边,然后对于一个点,如果和他相连的所有边都在最大匹配中,那么这个点必然可行。
T4
题意:有 个点,位置和权值给定。对于所有 ,求出选择 个点,使其中最大的位置 和权值之和的和最小。保证位置不降。
有东西,但不多。注意到对于每个 ,其所选的最远点单调递增。证明就你考虑 两个 ,如果 当前选择的最远位置小于 的最优位置,那么你移动到 的位置必然不劣。
因为你显然取出的是位置不超过一定距离中权值最小的几个,既然你 在较近的位置没有较远的位置优秀,那么 显然移动到 的位置,对于前 个所选的权值和最大位置显然不劣,而后面 个位置因为可选项增多了,也必然不劣。因此移动是不劣的。
既然有单调性,那么可以决策单调性dp。但是发现对于一个转移点在一段区间中的转移,你也只能 去算出他每个位置的答案,显然寄了。
但是注意到在决策单调性分治做dp过程中,有 层,且对于每一层,其所有决策区间刚好首尾相接,于是你可以对于每一层分治,维护对顶堆从左往右挨个扫,就能求出答案了。
复杂度 ,常数还行。
lgP1450
套路。先做完全背包求出每个价钱的答案,然后对于一个询问,你容斥计算至少有 个硬币寄了的方案数即可。
卡特兰数
对应 个点的二叉树个数, 个点的树个数, 的括号序列数, 个数所有进出栈最后栈是空的操作序列数。
通过折线法,设左括号是+1,右括号是-1,考虑不合法的序列对第一个小于0的位置以后以 为对称轴轴对称,容易发现这样一个折线和不合法序列一一对应,这样的序列数是 ,所有序列数目是 ,所以 。
矩阵
,其中 是 , 是 ,则 的意义可以理解为:
是三分图左部到中部的邻接矩阵(存路径条数), 是三分图中部到右部的,则 就是左部到右部的。
牛客某题
题意:有 个人,每轮轮流按编号从小到大发言,一个人可以发言或者不发言,所有人不发言就寄了。同时若有 个人发言,管理会禁言掉倒数第 个人,一个人发言并没被禁言得分,不发言不得分,被禁言-1145141919810分。
每个人智商无穷大,求每个人的得分。
结论是 个人会发言。因为容易发现,如果第 个人发言,显然后面的人都会发言寄掉他,所以他不动,同理,前面的人一直都不会动,直到 。
AGC某D
题意:有 个房子,每个房子有一堆人住,有一辆车从 出发,所有还在车上的人会投票左右往哪走(一次走一个位置,往多人的走,人一样就往左),每个人都最优策略使得自己到家最快,求每个位置的人到家的时间。
考虑最后一堆到家的人是谁?显然是最左最右中人数较少的(人数一样就是右边的),而且显然不管怎么样,必然会先到另一边使得那帮人下车再到家,所以他们会选择打不过就加入,向另一边那帮人的决定投票。于是递归合并一下,做完了。
考虑一条蛇什么时候会吃。显然如果一条蛇吃完不是最小的,它吃了之后必然不会被吃。因为次大蛇吃完会比它小,要被吃也是它先被吃(这种情况一旦发生,次大蛇就不吃了,游戏结束),所以放心吃。
于是先吃到最大蛇吃完变成最小值为止。此时最多可以吃一次(或者不吃)。
于是我们需要check一下能不能吃。
设 是剩 条蛇能否吃,则 确定当且仅当: 或者最大蛇吃完非最小。其余情况, 当且仅当 。
于是可以做。用堆维护带 ,可以用两个 deque 维护。
两条折线限制
有一个点 走到 ,一次可以走左上或左下,有两条线 ,要求走到 过程中不能碰到两条线。
不妨设 。
那么考虑对称。先考虑任意走(),然后减去碰到上面的方案数,就是把 按 对称到 ,这时走的方案数是 ,以及碰到下面的方案数,这是类似的。发现我们还需要加上碰上再碰下,碰下再碰上的方案数,减去碰下再碰上再碰下,碰下再碰上再碰下的方案数……不断容斥下去,直到 不够用了为止。
不难发现这个复杂度大概是 的。
树博弈
有一棵有根树,每次可以选一棵子树丢掉它,如果只剩根节点游戏就结束了。求谁会赢。
首先一棵树上面加一个节点,显然你任意时刻可以割掉这棵树结束游戏,相当于在整个 sg 集合中加了一个 0,所以子树中所有节点的 sg 值都加一,而对于任一节点,其每一棵子树都可以视作一棵这样的树,再加上这几个相互独立,该节点的 sg 值就是所有儿子的 sg 值 +1 的 mex。
Day6
T1
设 , 次询问给定 ,求 中前 大的和。, 组询问, 是 二进制下末尾 的个数。
考虑按位计算,不妨对于每个 值分开计算(钦定第 位是 1),则不难发现一共有 个 值,且其右移后 位后是连续段。
于是继续考虑二分答案 ,将大于等于 的前 大值加起来。这个只需要找出刚好使得大于等于 的数的个数不小于 的位置,将所有满足条件的数加起来减去等于 的多余数即可。当然这个需要枚举每一位之后减去 之后计算。
注意实际上由于 大的数很少,答案并不会爆 long long。
复杂度 。
T2
有一个石头剪刀布序列 ,有一些位置可以任选。每轮可以自己选两个相邻的人玩游戏,直到所有人都一样。分别求最后最多剩下多少 R/P/S。
首先哪个剩到最后都是等价的,于是对于三种胜者只需要分别做一遍相同的算法。
考虑设当前要赢的选项是 ,能杀这种人的是 ,能杀 但会被 杀的人是 ,不确定的是 。
有两种做法:贪心或者 dp。
贪心:你直接用 把整个序列劈成若干段,如果整个序列中没有 ,显然就一个不剩,子段中没有 ,显然不需要做。然后对于剩余的情况,考虑每个子段。
再在子段中用 个 把它劈成 段,则不难发现我们每一个子段只能避免删掉一个段中的 。那么只需要整出每一段暴力排序即可。当然对于 ,把他变成3需要多一的代价,所以你排序的时候要特判首尾的割开位置是 还是 ,是 就加一再排序。然后当然,如果代价一样,我们优先选最末的一段,因为他贡献的 会使下一段可能更优,且不劣。如果权值有差距,那么显然选较小的更优。因为加一的权值你放到下一段区间选也是一样的答案。
dp:你考虑使得两个 中必须有一个 或者干脆为空,则不难发现这样的序列中所有 都存活。于是你设 表示第 个位置,从上一个 到现在(不妨设 0 和 位置是 )为空/全为2/有3 的最大 个数,则容易转移,对于 只需要三种状态分别转移即可。
T3
有一个序列,有操作序列:全局取 (操作1),将一个位置变成 (操作2)。
现在每次永久撤回一个操作,求出每次撤回后序列的总和。
首先考虑将原序列变成从一个全0序列进行 次操作后形成的序列,那么就只用考虑操作序列。
然后删除不好做,仍然是从后往前当成加入做。
继续,发现原序列仍然不好维护,但是你发现一个位置的值是其最近一次2操作后面所有 操作的权的最大值,这是一个后缀最大值,于是把1操作序列建成线段树。那么你可以把原序列丢到线段树上维护。
然后容易看出只需要维护区间和(原序列答案和),区间含有的原序列个数,区间2操作序列最大值,然后一次加入操作,如果是 操作,就是把线段树上面原来的那个原序列删掉,在新的时间上加上, 操作就是对一段后缀取 ,这个可以线段树二分解决。
T4
有一个排列,要分别求出删掉每个 之后好的子序列个数(含空集)。好序列是你翻转一些不交的区间可以使得序列单增。
首先考虑这样的序列性质:可以分成若干段,每段单调递减且所有值都大于上一段最大值。
设 是 开头, 结尾的下降子序列个数,则设 是以 开头,当前位置是 的下降子序列个数,则显然其前面所有满足 的 的 之和就是 ,这个可以树状数组转移。于是 就是 ,这个是 的。
然后设 是 结尾,当前这段下降子序列的最大值是 的答案,那么显然 就可以帮我们确定序列首位置 。于是
这是 的,但是枚举每一个位置不选做是 的。
LOJ3252
两个都sort,然后小对小,大对大,于是预处理即可。
CF1612E
有 条消息,那么第 条消息的贡献容易计算,就是所有 的人 看到它的概率之和,然后你就选出贡献最大的 个(用 nth_element)。算一次是 的,但是发现你 最多只是 ,因为再大期望必然不会增多。于是做完了。
LOJ3318
考虑最优情况每次交换 会使得逆序对数加一,所以只需要求出最优的结束状态即可。发现对 从大到小插入,每次看比他大的 剩下哪些位置,贪心选最大的即可。容易证明这是最优的。只需要堆即可。
最后求逆序对数就是答案。
UOJ280
省集讲过,但是寄了。
考虑互不相同的话,你每次可以找到最大的数,使得他加进去之后的中位数不小于没加的最小值,这样必然最优。因为这样显然合法(后面加进的数都不小于中位数,不会使之变小,且后面顺序插入必然是可行解,所以可以这么放),加更小的不优,加更大的那么因为中位数已经大于最小值了,你后面加入最小值的时候必然会导致中位数减小。
如果有相同的数的话,我们找到最大的满足不大于所有数的中位数且有至少两个的位置,然后把这两个数填到最早,然后 一直填到小于的数全填完。然后按上面做即可。
为什么?首先前两个数最优比较显然,然后下一步填最大的 ,则下一个数必然最大只能填 使得中位数不增,接下来同理直到小的数全填完了,就变成了互不相同的做法。
CF1592F1
考虑二、三操作可以用一操作以不劣的代价执行,而四操作可以被四次一操作代替(其中有一次整个矩形),且当有两次四操作时,两个矩形可以抵消,则一可以凑出四,所以最多只做一次四。
差分一下矩形,一次一操作就是单点,所以操作数就是查分矩形中1的个数。枚举4操作位置即可。
CF1592F2
加强在四操作可能可以进行1145141919810次。
设 表示在 动用四操作,则更新了差分矩阵的 位置。
仍然有结论:不会在同一行或列动用多次四操作。因为如果用多次,显然可以被代价不劣的几次一操作代替。
同时只有 都为 的时候才能用四操作。
于是发现这个可以对满足条件的行和列建立二分图连边,跑dinic求出能少几次操作。
LOJ3469
对每个球二分天数,看哪一天和左右相邻的覆盖区间相交,然后就能求出分界线,进而求出覆盖区间。然后你可以预处理滚几天后最左/右的位置解决。
CF1661F
将每一段分别考虑,那么将这一段中加入 个传送点后,显然尽量平均是最优的,然后发现 到 的减少量比 到 的减少量要多,于是可以二分这个增量,并对于每一段二分出这个增量的最大 ,并求出这时的代价,然后不难发现我们二分到 的最大 ,然后用 不断多放一个直到代价不大于 即可。
LOJ3665/luoguP8163
设 表示从 出发走 步到达的最远左/右端点,然后倍增,转移是 RMQ。问题就是一步到达的位置,只需要用线段树维护即可。
CF1707E
给出引理:,,两个区间 (交非空) 的并等于 ,则两个区间跳到的位置可以合并成大区间的。
所以拆成 倍增。
LOJ3692
设 是 的树上 层儿子的乘,那么修改只需要每次修改最底下两层,然后向上跳一步,再修改上面两层,直到 级祖先。而询问也只需要向上跳 层。
CF1666E
Day7
难以表达,不做评价。
T1
有一棵线段树,求其所有节点的长度的 次方之和。 组询问。
傻逼题,一个经典结论是所有长度只有不超过 种,于是递推暴力快速幂。
T2
暴力题。对数组一次操作会将其中 的个数作为 。
次询问 经过 次操作的数组和。
不难发现经过比较少次数的操作就变成只有一个 了,所以对于大的 ,其实并没有用。
最多几次?经过简单计算,没两次操作数组有值的个数至少开根号,而且每次实际更新的位置非常少。于是可以维护操作 次数组的值,然后递归暴力修改。猜测这样很优秀。
证明一下:每次开根号,那么大概需要 次就变成只有一个1了,那么每次修改一个位置,每层都会最多修改两倍于上一层的位置,于是复杂度就是 了。
T3
对一个数组一次树状数组前缀和操作,即 。要求支持单点修改,查询某个位置经过 次操作的值,答案对 取模。
通过手玩或者严格推导,不难发现 经过 次操作,会对其向上跳(这里的跳就是加 ) 次的数产生 倍原值的贡献。于是可以一只 维护。
T4
还是暴力题。。大意了。。
题意比较感性,不写了。有 次询问。
你考虑暴力怎么做?是不是你从小到大枚举 ,直到 ,那么不难发现每次只需要一段值 或起来包含当前的 就可以匹配继续考虑下一个位置。
这样实际上是每次找一个最大的二进制位使得 包含,但 不包含,然后将 的这一位变成 ,后面全变成 0。容易发现这样是对的。
当然,如果 被 包含了,那么显然可以直接二者同时加一。
然后发现一个性质:如果 被 包含并且他们后面同时有若干个0,那么根据刚刚说的,我们会不断同时加一直到二者至少有一个原来 0 前面的位置变化。
可以发现,我们对上面的暴力做这一步优化,那么可以分析复杂度是单次 的。
为什么?显然每次 包含 时,我们进行快速的加一, 中最末位的 必然多一个,这时 可能也有一些进位,但是我们每次会钦定一位使得 包含 ,每次最多钦定 轮就可以多一个末位 0。所以我们得到了一个非常松的上界 ,实际上上界是 的,但是不太会证,反正一点都跑不满,而且才 5e5。
通过这场比赛,可以发现以后还是不会正解就要敢猜测暴力经过好的优化复杂度会很好。万一复杂度对了呢?万一数据卡不掉你呢?
CF1485E
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现