01 2021 档案
摘要:题面传送门 考虑前缀和后转化为区间最长相等数距离。 那么可以回滚莫队解决。 回滚莫队是什么呢?适用于一些只能增加而很难减少的情况。 将莫队左端点在一个块时,右端点升序排序,同时维护最左和最右即可。 代码实现: #include<cstdio> #include<algorithm> #include
阅读全文
摘要:题面传送门 一看到两条路线不交我们就可以想到容斥。 两点间的路径条数显然可以递推出来。问题是怎么容斥。 考虑如果两条路线不交,那么一定一只乌龟开始第一步向上走,一只向右走。 同理,在终点时一定有一只乌龟最后一步向右走,另一只向上走。 所以变成了四个点之间的问题。 考虑如果$(1,2)
阅读全文
摘要:题面传送门 挺好的一道题。 首先一个很明显的贪心:先加后乘,这样一定最大。 然后又注意到,在最大子段和为正时,第二个操作的使用次数不会超过次。 所以可以枚举第二个操作的执行次数。 那么第一个操作显然是在刚好的时候最优,这个用二分可以轻松解决。 时间复杂度 代码实现
阅读全文
摘要:题面传送门 一道题数据范围那么小肯定考虑搜索。 但是这个数据范围稍微偏大了一点。 所以就可以折半搜索。 但是这样卡不进去。 我们的map一般是这么写的 ans+=f[i][k-z]; 然后我换成这么写直接300ms if(f[i].count(k-z))
阅读全文
摘要:题面传送门 蛮好的一道题,可惜我不会证( 有回文串那么考虑Manacher 首先手玩一下就能发现,如果在右半边更新答案,那么当前答案右端点一定过当前右端点 然后再手玩就能发现,如果当前左端点过当前最大中点,那么就是可以更新答案的。这样肯定最大,然后就完了。 代码实现: #include<cstdio
阅读全文
摘要:题面传送门 树上问题没有修改,考虑倍增。 然而发现如果暴力合并线性基要铁定过不去。 考虑优化。 可以发现线性基有一个很优秀的性质就是两个有重叠部分的线性基合并是没有影响的。 那么可以用st表的思虑拿来合并了,复杂度降到$O(nlognlog2w+q
阅读全文
摘要:题面传送门 发现这道题主要不是思维难,而是高精难打。还难卡常 的显然很好处理,考虑怎么做 首先设两个分支为,那么会衍生出三个分支容易发现仍然只有两个本质不同。 那么只要暴力递归下去判个重即可。 但是问题是这样过不去。 考虑
阅读全文
摘要:题面传送门 这题十分卡精度,我开到了才过去。 主要有两种做法。 两种做法的核心都是一样的,就是求出相邻两棵树在什么时候一样高。建权值为同样高时间的边,然后找出最大的连通块使的边权相同。 但是在找的过程中我们发现有一些树可能初始高度一样且生长速度一样,那么这些树在任何时候都相同高。
阅读全文
摘要:题面传送门 原以为cf出了裸题。 然后发现不是。 考虑每一个修改其实可以变成修改当前点到下一次修改这个点的位置。 那么就可以上线段树分治乱搞。如果不改变就看成修改成自己。 注意种颜色互不影响,所以可以分开算。 但是这个点修改成什么颜色不得而知。 线段树分治有一个性质就是一定先查询当前点再继续下
阅读全文
摘要:题面传送门 显然对于一个集合的点会被拓展出一个长方形,也就是横着去重后的点数乘以竖着去重后的点数。 那么用一个扩展域并查集维护即可。 但是问题是有撤销,而并查集不支持撤销。 所以直接上线段树分治即可。注意要用可撤销并查集。 代码实现: #include<cstdio> #include<vector
阅读全文
摘要:题面传送门 堆了好久的题目终于过了。 考虑预先处理出每个图内部是否是二分图。 那么只要枚举每一条边,找到非二分图,然后用总颜色减去即可。 找到二分图这一步考虑用并查集。 但是在下一对颜色中这个是不能算的。 所以用可撤销并查集即可。 代码实现: #include<cstdio> #include<ve
阅读全文
摘要:题面传送门 第二道卷题。一道好题目。 这种异或的题目就可以建立 考虑由每个节点的子树向这个节点的父亲转移。这里线段树合并可以搞定。 那么显然合并时需要对于子树中每个点都 但是考虑在上怎么搞这个东西。 由于树没有边权,所以肯定有什么特殊性质。 考虑一个数的二进
阅读全文
摘要:题面传送门 考虑做差法,判断最后的值得正负来选择。 一开始有一个想法就是尽可能挫败对手,但是这是显然不正确的。 考虑有一个奇数,有一个偶数。设当前状态为,同时设 如果Alice选择奇数,那么最后的结果 反之则$f_{s|x
阅读全文
摘要:题面传送门 又是一个自己yy出来的数据结构。 考虑在时间轴上建立线段树。 模仿左偏树那题,把修改拆成个询问。 对于每个节点,用扩展域并查集来维护有没有奇环。然后如果这个区间有奇环那么就直接输出。 但是还有一个问题退出当前节点时要撤销这个点的贡献。 那么可以上按秩合并可持久化并查集即可。
阅读全文
摘要:题面传送门 这道题直接套即可。 但是问题是怎么套呢? 考虑维护查询和修改的时候,我们对于修改标记,查询标记,所以我们可以在进入下一层前将左半边设成修改,而右半边设成查询即可。 还有这道题卡常。 代码实现: #include<cstdio> #inc
阅读全文
摘要:题面传送门 考虑怎么把绝对值拆掉。 可以把坐标系旋转四次然后统计左上方的点,这样可以拆掉绝对值。那么就是要找左上方最小的点,变成三维偏序问题。 可以用分治轻松解决。 注意这道题卡常,可以尝试把中的快排换成归并能快好几倍。 同时只对询问查询。 时间复杂度$O(nlog^2
阅读全文
摘要:题面传送门 把交叉转化成 然后就是三维偏序板子题了。注意树套树过不去,要用分治。 树状数组随便维护一下就好了。 代码实现: #include<cstdio> #include<algorithm> #define max(a,b) ((a)>(b)?(a
阅读全文
摘要:题面传送门 主要一个方法以前没有接触过现在补一下。 就是判断一个区间平均数有没有到则每个减看总和有没有到。 处理完之后就是求正序对数量分治随便搞就好了。 代码实现: #include<cstdio> using namespace std; int n,m,k,x,y,z,a[10
阅读全文
摘要:题面传送门 分治板子题。 首先两个能互相看到,如果小的一个能看到大的,那么就一定能互相看见。 所以先将视野排序。 然后内部考虑把智商定为第二关键字,因为不变保证了单调性。 位置用动态开点线段树维护即可。 代码实现: #include<cstdio> #include<algorith
阅读全文
摘要:题面传送门 这道题就是分治板子题。 首先排消去一维偏序。 然后先分治子序列,再分治当前序列。 分治时对当前序列两部分分别进行排序。 分治的核心是左序列向右序列算贡献。 考虑枚举右序列每一个元素,同时在左序列维护一个指针,指针左侧的值小于等于当前右序列值。
阅读全文
摘要:题面传送门 这个东西不太好维护,考虑转化成这一区间中的人分数相同。 则只有选出一些区间,这些区间要么完全重合,要么完全不交,这些人才没有说谎。 显然有式$dp_i=\min\limits_{dp_j+1[(x_ix_j&&y_iy_j)||x_i>
阅读全文
摘要:题面传送门 只有询问没有查询,显然可以离线下来算贡献。 先预处理出一号节点到每个叶子节点的距离,然后进入一棵子树是添加贡献,一棵子树遍历完了撤销贡献即可,这个可以用线段树维护。 时间复杂度 代码实现: #include<cstdio> #include<vector> #
阅读全文
摘要:题面传送门 题解里居然没有对这个东西复杂度严格证明的,我来补一发。 首先暴力不再赘述。 可以加上一些剪枝,如果我们对于每个倒序枚举每个,那么如果,那么就不用往下枚举,因为接下来的一定与前一个所枚举的相
阅读全文
摘要:题面传送门 数据这么小,显然要网络流。 从源点向每个菜连边,从每个饮料向终点连边。 为了保证每头牛只被算一次,所以对每头牛拆点。 其余照常即可。 代码实现: #include<cstdio> #include<cstring> #include<queue> #define beg(x)
阅读全文
摘要:题面传送门 还是分治。 考虑建出一棵线段树,每个节点分成到的后缀线性基和到的前缀线性基,查询推到不能再推时两个线性基合并即可。 时间复杂度 代码实现: #include<cstdio> #include<cstring> using
阅读全文
摘要:题面传送门 一句话题面:区间01背包。 这种东西可以用分治解决掉。 发现如果完全合并两个dp状态是的,但是如果只是针对某一个值的合并只是的。所以这题中不能进行合并状态。 预处理线段树上每个节点到与到的两部分状态。 在一棵线段树上
阅读全文