摘要:
题面传送门 考虑一下,会发现这个东西不太好算,考虑容斥一下,用总数减去一个都没有出现的个数。 那么就可以设$dp_{i,j}$表示匹配到$i$,AC自动机上匹配到$j$的方案数。预处理一下就可以做了。 时间复杂度$O(m\sum{|S|})$ 代码实现: #include<cstdio> #incl 阅读全文
摘要:
CF1473A 显然要么是初始整个序列就都小于$d$,否则大于$d$的需要变成最小值加上次小值。判断一下即可。 code: #include<cstdio> #include<algorithm> using namespace std; int n,m,k,x,y,z,t,a[139],d,max 阅读全文
摘要:
题面传送门 第一道AC自动机优化dp 考虑$dp$方程式怎么列,会发现无论怎么平凡的设法都会有后效性。因为是匹配,所以考虑在AC自动机上设状态。 设$dp_{i,j}$表示匹配到$i$,在AC自动机上为$j$点的最大值。则每个往后转移即可。 注意可以预处理出每个点跳fail能得到的权值。 时间复杂度 阅读全文
摘要:
题面传送门 因为上一题单串匹配是KMP+栈,所以这道题多串匹配考虑AC自动机+栈。 开一个栈记录当前没有被弹出的字符。同时记录匹配到了那个节点,在AC自动机上跑匹配即可。 注意有一个方法就是字符串结束标记上直接打上字符串长度这样就不用那么烦。 时间复杂度$O(|S|+\sum{|T|})$ 代码实现 阅读全文
摘要:
这里给三个板子做一个总结 简单版 AC自动机就是KMP+Trie,fail指针在多模式串之间跳跃来进行匹配。 fail指针有一种很妙的写法: inline void bfs(){ register int i,tot; for(i=0;i<26;i++)if(f[0].son[i]) q.push( 阅读全文
摘要:
题面传送门 题目这个删掉后重新接成字符串很难处理,所以考虑用栈来衔接。 那么可以记录前一个匹配到哪里,然后就可以继续匹配。 时间复杂度$O(n+m)$ 代码实现: #include<cstdio> #include<cstring> using namespace std; int n,m,k,x, 阅读全文
摘要:
题面传送门 没有修改,考虑莫队,容易想到一个移动指针时用树状数组维护的$O(n\sqrt nlogn)$的方法,但是过不去。 这种情况就可以考虑莫队二次离线,把询问拆分,分类讨论一下即可。 注意这道题需要维护正反两个离线。注意卡常。注意离线那个树状数组要用域值分块来做到$O(1)$查询。 哦还有这道 阅读全文
摘要:
题面传送门 考虑一般的莫队。复杂度$O(n\sqrt nC_{14}^{7})$ 这里面转移的复杂度略微有点大。 考虑$[l,r]\(转移到\)[l,r+1]$的贡献。即$a_{r+1}\(对于\)[l,r]$的贡献。 这个东西可以差分,变成$[1,r]-[1,l-1]$,然后就可以统一计算了。 剩 阅读全文
摘要:
题面传送门 题解区居然没有一个写理论复杂度最优的算法的。那我就来讲一下。 首先显然有一个结论:对于一个$b_i$,和小于$z-b_i$且最大的$a_i$连线时最优的。因为这样可以为大于当前$b_i$的提供更优条件。 同时没有修改就可以考虑离线算法,比如莫队。 莫队的增加时就是把当前$b_i$按照上面 阅读全文
摘要:
题面传送门 闲着没事开始清任务计划。 显然单调栈处理出一条列当前的最高的点,然后单调栈向左右拓展找到第一个小于的点,细节处理一下即可。 时间复杂度$O(n^2)$ 代码实现: #include<cstdio> #define min(a,b) ((a)<(b)?(a):(b)) #define ma 阅读全文
摘要:
题面传送门 因为不会写hard所以滚回来写medium了。 考虑dp,设$dp_{i,j}$为到$j$,分了$i$段的最大价值,有显然式子$dp_{i,j}=\max_{dp_{i-1,k}+w(k+1,j)}$ 这个是$O(n2k)$的,不能过。 考虑优化,看到后面那个范围很小,那么开个桶记录即可 阅读全文
摘要:
题面传送门 考虑前缀和后转化为区间最长相等数距离。 那么可以回滚莫队解决。 回滚莫队是什么呢?适用于一些只能增加而很难减少的情况。 将莫队左端点在一个块时,右端点升序排序,同时维护最左和最右即可。 代码实现: #include<cstdio> #include<algorithm> #include 阅读全文
摘要:
题面传送门 一看到两条路线不交我们就可以想到容斥。 两点间的路径条数显然可以$O(n^2)$递推出来。问题是怎么容斥。 考虑如果两条路线不交,那么一定一只乌龟开始第一步向上走,一只向右走。 同理,在终点时一定有一只乌龟最后一步向右走,另一只向上走。 所以变成了四个点之间的问题。 考虑如果$(1,2) 阅读全文
该文被密码保护。 阅读全文
摘要:
题面传送门 挺好的一道题。 首先一个很明显的贪心:先加后乘,这样一定最大。 然后又注意到,在最大子段和为正时,第二个操作的使用次数不会超过$logs$次。 所以可以枚举第二个操作的执行次数。 那么第一个操作显然是在刚好的时候最优,这个用二分可以轻松解决。 时间复杂度$O(nlog^2s)$ 代码实现 阅读全文
摘要:
题面传送门 一道题数据范围那么小肯定考虑搜索。 但是这个数据范围稍微偏大了一点。 所以就可以折半搜索。\(O(3^{\frac{n}{2}})n\) 但是这样卡不进去。 我们的map一般是这么写的 ans+=f[i][k-z]; 然后我换成这么写直接300ms if(f[i].count(k-z)) 阅读全文
摘要:
题面传送门 蛮好的一道题,可惜我不会证( 有回文串那么考虑Manacher 首先手玩一下就能发现,如果在右半边更新答案,那么当前答案右端点一定过当前右端点 然后再手玩就能发现,如果当前左端点过当前最大中点,那么就是可以更新答案的。这样肯定最大,然后就完了。 代码实现: #include<cstdio 阅读全文
摘要:
题面传送门 树上问题没有修改,考虑倍增。 然而发现如果暴力合并线性基要$O(nlognlog2w+qlognlog2w)$铁定过不去。 考虑优化。 可以发现线性基有一个很优秀的性质就是两个有重叠部分的线性基合并是没有影响的。 那么可以用st表的思虑拿来合并了,复杂度降到$O(nlognlog2w+q 阅读全文
摘要:
题面传送门 发现这道题主要不是思维难,而是高精难打。还难卡常 $2i$的显然很好处理,考虑$2i+1$怎么做 首先设两个分支为$2k-1,2k$,那么会衍生出三个分支$k-1,k,k$容易发现仍然只有两个本质不同。 那么只要暴力递归下去判个重即可。 但是问题是这样$O(Tlog3n)$过不去。 考虑 阅读全文
摘要:
题面传送门 这题十分卡精度,我开到了$10^{-12}$才过去。 主要有两种做法。 两种做法的核心都是一样的,就是求出相邻两棵树在什么时候一样高。建权值为同样高时间的边,然后找出最大的连通块使的边权相同。 但是在找的过程中我们发现有一些树可能初始高度一样且生长速度一样,那么这些树在任何时候都相同高。 阅读全文
摘要:
题面传送门 吸了口氧一发最优解可还行。把$G$设为$1$,把$H$设为$-1$,$sum$为前缀和。 显然有$O(nk)$的$dp$:\(dp_i=\min\limits_{j=\max(1,i-k)}^{i-1}{dp_j+(sumi\geq sumj)}\) 这东西两个看起来不好优化。 但是注意 阅读全文
摘要:
题面传送门 原以为cf出了裸题。 然后发现不是。 考虑每一个修改其实可以变成修改当前点到下一次修改这个点的位置。 那么就可以上线段树分治乱搞。如果不改变就看成修改成自己。 注意$k$种颜色互不影响,所以可以分开算。 但是这个点修改成什么颜色不得而知。 线段树分治有一个性质就是一定先查询当前点再继续下 阅读全文
摘要:
题面传送门 显然对于一个集合的点会被拓展出一个长方形,也就是横着去重后的点数乘以竖着去重后的点数。 那么用一个扩展域并查集维护即可。 但是问题是有撤销,而并查集不支持撤销。 所以直接上线段树分治即可。注意要用可撤销并查集。 代码实现: #include<cstdio> #include<vector 阅读全文
摘要:
题面传送门 堆了好久的题目终于过了。 考虑预先处理出每个图内部是否是二分图。 那么只要枚举每一条边,找到非二分图,然后用总颜色减去即可。 找到二分图这一步考虑用并查集。 但是在下一对颜色中这个是不能算的。 所以用可撤销并查集即可。 代码实现: #include<cstdio> #include<ve 阅读全文
摘要:
题面传送门 第二道$A$卷题。一道好题目。 这种异或的题目就可以建立$01trie$ 考虑由每个节点的子树向这个节点的父亲转移。这里线段树合并可以搞定。 那么显然合并时需要对于子树中每个点都$+1$ 但是考虑在$trie$上怎么搞这个东西。 由于树没有边权,所以肯定有什么特殊性质。 考虑一个数的二进 阅读全文