随笔分类 - 模拟赛
摘要:这种选条的东西一般就是wqs二分。 这道题目显然有凸性,然后就可以二分斜率了。 但是这个输出方案很难搞,按照wqs二分分的方案只有90分因为有斜率相同。 我们考虑对每个点维护两个值和表示最小和最大能选的段数。 这个东西dp的时候稍微处理一下就好了。 然后我们对于每一个点,如果
阅读全文
摘要:这个东西正着不太好做我们考虑二分转化成判定性问题。 然后问题就变成:每个物品有一个重量和一个容量,要选取最多的物品且选取一个物品时已经选的物品重量总和不能超过当前物品容积。 这个东西可以反悔贪心,具体地,我们维护一个堆,并将排序,然后得到一个物品时先判断能不能直接放进去,然后看能不能将最大的替
阅读全文
摘要:首先这道题你发现所有异或和不变所以当异或和为时一定平局。 当异或和不为时我们只要考虑最高位即可。 具体的,我们将拥有这个最高位的置为,没有的置为,然后就变成了如何让先手取到的个数为奇数。 这个东西写个dp就可以了。 然后把dp打表输出规律就可以$O(n)
阅读全文
摘要:那个bitset做法是真的屑所以我们考虑更优秀的做法。 考虑分治。 对于一个轴分治,对于两个点在分治线两边的就一定会经过中轴线,我们只要预处理出每个点到中轴线上每个点的连通性然后看看是否在中轴线上有一个点两点均可达。 然后分治下去即可,时间复杂度,但是并没有代码
阅读全文
摘要:题面传送门 这种东西一眼看上去很不可做。 然后想到了fbi的转移矩阵其实是 又因为矩阵乘法满足结合律和分配律,然后就可以用线段树维护区间矩阵加和即可。 时间复杂度 code: #include<bits/stdc++.h> #
阅读全文
摘要:首先这个分的树形dp很好打,直接裸的树上背包合并即可。加了一个每次与子树大小取min的剪枝。 时间复杂度是 然后写了一发过了。 然后再考虑这个东西的复杂度。 首先考虑产生贡献的时候,这个显然是只有次的。 然后如果是小于合并到大于,容易发
阅读全文
摘要:一眼看成分段方式从前到后。 我们先考虑什么情况两个字符集拼出来地字符串会相同,容易发现是两个字符集全等。 这个东西可以用hash判定。 然后我们考虑怎么求出这个字符集。 每次这个块会向右走一个,那么会多一个块再少一个块,然后这个也可以字符串hash维护。 就做完了。之后重排列计数一下即可。
阅读全文
摘要:打表天下第一不接受反驳 这里讲不打表做法吧。 我们考虑枚举一个数算出另一个数的贡献。 然后这个还不太好算我们再枚举一维长度。 我们将所有长度为当前长度的子串加入AC自动机中,并限制一旦走到长度为当前长度的节点就不能走下去。 那么就可以愉快地数位dp了。 时间复杂度大概是 代码就写了
阅读全文
摘要:首先第一问的树形换根dp是很显然的。 首先一次dp算出一个点子树内的答案,然后再一次换根把儿子什么的排个序就好了。 考虑第二个怎么做。 我们考虑到之间的路径,这中间肯定有一条边是不被走到的,然后感性理解一下这个东西具有可二分性。 就是大概要找到一个两边平均的位置。 然后就很好做了。时间复
阅读全文
摘要:这个东西的很小,考虑爆搜。 首先我们对于每层爆搜我们要保证每次搜到的是最优的。 而且我们还要同种的一起处理。 我们考虑对每一层开一个vector,存的是当前搜到的可以作为一个end的位置可重集合。 然后每次扩展肯定是找到这一范围内最小的没被搜过的点进行。这个可以用主席树维护后缀k小值实现。 然
阅读全文
摘要:这个东西分暴力很显然,直接每次询问跑一次树上背包即可。 然后考虑这个随机有什么用 这个东西树高是,每个节点的孩子个数期望 那么每次修改暴力跳修改,然后每次查询暴力跳询问即可。 但是这个东西还可以不依赖树随机,因为最大只有,所以跳层就可以回来
阅读全文
摘要:这个东西显然可以二分。转化为判定性问题。 我们考虑一个答案怎么被判定合法。 首先我们将大于等于的边去掉,然后得到若干个连通块,每个连通块有一个和的总和。 考虑这个有什么充要条件之类的,仔细思考一下会发现就是对于任意都有 这个证明
阅读全文
摘要:图不连通差评。 可以发现这样建边每个连通块只有一个环。 这样的话环上的点可以任意选择。 但是然后如果你正着这样做不是很好做,考虑反过来。求最长上升就好做了,用一个支持撤销的树状数组维护即可。 时间复杂度 code: #include<bits/stdc++.h> #define
阅读全文
摘要:很妙的一道题。 首先我们考虑将所有老鼠都进左边能进的且最优的洞。 然后有些老鼠其实是可以反悔的去选右边的洞,如果设第只老鼠原来连,反悔去连,那么对答案的贡献就是 可以发现这个东西对独立,那么我们用一个堆维护即可。 但是一个洞也可以反悔不去选那个老鼠
阅读全文
摘要:卡常题差评。 首先这个东西我们可以枚举中间那个然后扫描线,那么就变成右边不超过某个值的对左边的逆序对个数这个东西可以直接线段树搞。 但是这样常数大的和*一样,我们考虑换一种方法。 我们枚举第一个点,那么其实后面的方案数就是大于第一个点随意排列的方案数减去三个点连续上升的方案数。
阅读全文
摘要:感觉像是一种模拟费用流。 首先这个东西费用的计算式为 拆开变成,这个东西对于两边独立。那么我们维护一个关于的单调上升的单调队列。 对于越往前的位置费用越小,但是流量越小。 那么挨个弹飞即可,然后对单调队列打上整体标记。 时间
阅读全文
摘要:你看到这种东西就想到树的直径。 然后随便口胡反证一下就可以知道就是两种情况:一种是一条是直径,另一条是除去直径后的子树的最大直径,另一种是直径扣掉一段,然后扣掉的两个端点分别向下挂两条链。 第一种情况跑出直径随便处理,第二种情况预处理前缀随便搞搞。时间复杂度 code: #in
阅读全文
摘要:首先如果你做过CSP2019纪念品那道题你大概很快就会想到差分。 因为我们在第一天买进第三天卖出等同于第一天买进第二天卖出,第二天卖出第三天买进。 然后第一问就是对于所有的数加起来就好了。 第二问有一个simple的想法就是统计连续的个数,但是会有单独的情况。 转化一下
阅读全文
摘要:首先你有一个的显然做法:枚举重复路径两个端点,计算重复路径和非重复路径的长度,然后三分最大值即可。 这个东西显然过不去,发现瓶颈在三分上,考虑优化。 发现对于一个固定的重复路径长度,非重复路径肯定越短越好。 那么不就只用三分次了? 时间复杂度就变成了 cod
阅读全文
摘要:你会发现这个东西看上去很玄学。 然后这个你会发现其实和是互不影响的。 所以我们对于每个数的后继都找到然后状压一下看看最大值然后最后将所有加起来即可。 注意如果一个数被算过了那么打上标记不再算。 时间复杂度 code: #include<bits/stdc++.h> #def
阅读全文