02 2021 档案
摘要:题面传送门 考虑经典结论: 代到原式里面去就是$\sum\limits_{\sum\limits_{\sum\limits_{a|i}{\sum\limits_{b|j}
阅读全文
摘要:CF1492A 按照题意模拟即可。注意ceil会有精度误差。 code: #include<cstdio> #include<cmath> #include<bits/stdc++.h> using namespace std; long long t,a,b,n,m; inline long lo
阅读全文
摘要:莫比乌斯反演是个很玄学的东西,这里面的东西我都证明不来。 众所周知,oier只需要结论而不需要证明 首先定义莫比乌斯函数这个函数取值是这样的: 当时, 当时且为两两不同的质数,\(\m
阅读全文
摘要:其实一直没有把整除分块看成一个算法,只看成一个思维。然后发现我不会思维了,于是来补一下学习笔记。 看一道例题:UVA11526 就是求 我们发现很多值都是一样的,所以可以快速计算掉。 具体的,我们发现到内所有数是
阅读全文
摘要:题面传送门 虚树,顾名思义是虚的,就是不能完全代表一棵树的树。 换句话说,虚树上只保留对我们有用的节点。而其它节点就没有必要存在。 可以来看一道例题[SDOI2011]消耗战 我们很容易发现,如果只保留树上的资源点和资源点两两之间的lca,那么其余的点全部是没有用的。 同时我们又知道结论:个点
阅读全文
摘要:我第一次学习SAM,可能有很多地方理解有偏差或者错误。还请各位大佬指正。这篇文章中没有严谨的证明,只有感性的理解。追求严谨的请转他处。 首先我们定义Parent树:一个节点与其所代表的字符串的最长的,且出现次数与其不一样的后缀连边,所形成的树是Parent树。 可以发现Parent树有很多优秀的性质
阅读全文
摘要:题面传送门 为什么写的是分治NTT啊,有哪位大佬会实数取模的FFT教我一下。 首先观察这个东西不是很好搞。因为后面要基于前面的转移。 但是我们发现如果用分治就可以无视这个限制。 所以用cdq分治,转移区间为中点就先把的和的卷起来
阅读全文
摘要:替罪羊树是一种平衡树。然而它既不能可持久化,又不能维护区间。 所以把它发明出来干嘛? 然而它可以维护子树内信息。这个是一众平衡树都不能做到的功能。 它维护平衡的方式和普通的平衡树疯狂旋转不太一样。它是如果这个子树不平衡就把这个子树拍平了重构。 具体地,如果左子树的节点数和右子树的节点数比值超过某个值
阅读全文
摘要:题面传送门 这个东西其实和序列上sa差不多,树上倍增数组预处理后同样倍增即可。 但是有一个问题就是序列上的sa由于各后缀长度不一,所以不会出现相等的情况,而树上则会出现。 由于题目中给出的比较方法是依据父节点的,而题目中又保证父节点在子节点前面,所以从小到大处理即可。 时间复杂度
阅读全文
摘要:题面传送门 高斯消元板子。 可以去翻翻七下数学书一元二次方程组中的代入消元法。 对于一般的整数方程我们可以用加减消元法。但是计算机不会,怎么办呢? 只能用算起来很复杂的代入消元法了。 一个一个系数来消。首先选择当前系数下最大的那个,这个可以保证精度。 然后将系数化为 之后把剩下每个方程的当前未
阅读全文
摘要:CF1485A 很不寻常的A题。 首先肯定有结论:第二个操作先做,再做第一个操作最优。 然后可以发现,操作次数不会超过一个很小的数。 所以可以枚举第二个操作的次数。然后计算即可。 这里取 时间复杂度 code: #include<cstdio> #define m
阅读全文
摘要:题面传送门 zyq扒原题不要脸! 题目要我们求图上任意两点间最短路。 这个显然很难解决。 于是我们可以观察一下数据范围。 然后就可以发现一个奇怪的事情,最多只是生成树上加条边。 考虑先随便搞出一棵生成树。然后对于这条边强制走,剩下的生成树上lca即可。 然而,这道题zyq丧心病狂地卡
阅读全文
摘要:题面传送门 考试的时候脑子抽了,想到分暴力就没想了,甚至连状压都想到了,然后弃了。因为我第一题动都没动。 现在想想真是血亏。 首先发现每一位是没有任何关系的,所以可以每一位分开考虑。 这个式子首先肯定是先搞一个栈转成后缀形式再搞就比较好搞。 没有问号直接扫一遍求值即可。 考虑有问号的直接上$
阅读全文
摘要:CF1480A 显然先选前面的。 对于先手,如果当前位不是,变为即可。 否则变为。 后手也这样分类讨论一下就好了。 code: #include<cstdio> #include<cstring> using namespace std; int n,m,k,x,y,z,t; ch
阅读全文
摘要:题面传送门 真是一道毒瘤题。 容易想到先把所有插入AC自动机,然后在每插入一个时算贡献。 但是有一个问题是插入时可能会对一个串造成许多贡献。 这时就有一个很妙的trick:把所有待插入位置按dfs序排序,然后把每个点单点加的时候在每两个点lca处差分,这样就可以保证每个串只被计算一
阅读全文
摘要:题面传送门 感觉完全没有黑题的难度啊为什么要给黑的呢? 这种区间不太好搞,考虑差分。差分成 字符串匹配的题目就套路地上fail树。 考虑离线先把所有字符串插入AC自动机,并记录路径。 然后扫到一个点就按照路径插到AC自动机中,用树状数组+dfs序维护。之后就好了。 时间
阅读全文
摘要:题面传送门 真的吐血。百度上说真因数是除去与它本身,但这道题如果除去样例一都过不去,害的我调半天。 看到很小,所以可以把所有序列枚举出来并插入AC自动机里面去。 然后设表示第个数匹配到自动机上第个节点,判断一下跳fail指针时会不会碰到序列的尾部节点
阅读全文
摘要:CF1481A 照题意模拟即可。判一下有没有不够的情况。 code: #include<cstdio> #include<cstring> #include<queue> using namespace std; int t,n,m,k,x,y,z,now1,now2,now3,now4,flag;
阅读全文
摘要:题面传送门 其实IOI题目一出来就口胡出这道题了,然而一直不想打,直到WC之后想缓解一下WC爆炸的心情,所以滚来写这道题。 这道题果然没有让我失望! 我们可以考虑一件事情:只要有或一个联通块中有两个环,那么一定无解。因为这样子一定有至少一个 这样就少掉了一种
阅读全文
摘要:题面传送门 像这种多字符串匹配就可以考虑建出AC自动机来搞。 如果没有增删操作直接匹配即可。 但是这道题有增删操作。每个节点fail子树内的权值会变。 所以可以把fail树的dfs序跑出来在上面维护树状数组即可。 讲道理这道题询问很多修改很少应该套分块才是,但是出题人没卡就不管了 时间复杂度$O(\
阅读全文
摘要:Day -INF 报了一下WC,希望能进。 后来发现我校一个csp-s100分没到的人都进了。、 Day 0 开始停课(尽管就停一天) 打了HHHOJ一场比赛,最后一题线段树维护hash被卡了模数卡掉分还可行。这标志着我会WC会被卡常。 Day 1 开幕式没出锅还可行。 dzd金句: 虽然我们
阅读全文
摘要:题面传送门 这其实很cf。 我们发现如果整个网络是连通的话那么就不需要等到最后一个就可以知道。 所以我们要让其不连通。 那么只需要将最后一条边以及与这条边一个端点连接的边都设为0即可。 代码实现: #include<cstdio> using namespace std; int n,m,k,x[3
阅读全文
摘要:题面传送门 数据这么大显然是要我们用线性算法。 考虑把这个东西放到AC自动机上,预处理出每个节点能从哪些位置转移,这样的复杂度是的,不是很优秀,可能会被卡满。 发现dp转移方程是一个或的形式,也就是只要有一个为即可而并不要求是哪一个为,所以就可以考虑状压
阅读全文
摘要:题面传送门 实在写不动AC自动机于是跑来写dp了。 考虑这个怎么转化。 首先可以转化为求最大边数然后加一。 左右端点一定有一种最优情况不是叶子节点,因为如果是叶子节点那么叶子节点上面那个也行。 之后计算一下每个点的度,每个点的贡献是度-1,即减去与其父节点的连边的重复贡献。 然而你会发现根节点多减了
阅读全文
摘要:题面传送门 话说我居然连快读都没加就过了。 容易想到莫队。 首先可以看出一个节点增/删有两个贡献:区间比它小的数的个数和区间比它大的数的和。 容易想到可以用树状数组维护,但是这个是的,不是很优秀。 考虑莫队二次离线,那么分开算贡献即可。 注意离线时用域值分块可以做到
阅读全文
摘要:题面传送门 AC自动机蛮好的一道题,需要有一定对AC自动机的理解。 首先把所有字符串扔到AC自动机里面去。然后求出fail指针。 对于每个询问暴力匹配肯定是不行的,考虑怎么转化。 可以发现如果把fail指针抽出来,那么一个节点的子树内所有节点都能与这个节点匹配。 那么就可以把询问离线然后dfs搞。
阅读全文
摘要:题面传送门 这个东西很难优化,考虑用另一种方法计算。 考虑枚举断点,左边为,右边为。左边直接AC自动机匹配即可。但是右边很难搞。 发现右边要匹配前缀不好处理,那么就让模式串和文本串同时反序,就可以变成好搞的后缀了。 时间复杂度 代码实现: #inclu
阅读全文
摘要:题面传送门 考虑一下,会发现这个东西不太好算,考虑容斥一下,用总数减去一个都没有出现的个数。 那么就可以设表示匹配到,AC自动机上匹配到的方案数。预处理一下就可以做了。 时间复杂度 代码实现: #include<cstdio> #incl
阅读全文
摘要:CF1473A 显然要么是初始整个序列就都小于,否则大于的需要变成最小值加上次小值。判断一下即可。 code: #include<cstdio> #include<algorithm> using namespace std; int n,m,k,x,y,z,t,a[139],d,max
阅读全文
摘要:题面传送门 第一道AC自动机优化dp 考虑方程式怎么列,会发现无论怎么平凡的设法都会有后效性。因为是匹配,所以考虑在AC自动机上设状态。 设表示匹配到,在AC自动机上为点的最大值。则每个往后转移即可。 注意可以预处理出每个点跳fail能得到的权值。 时间复杂度
阅读全文
摘要:题面传送门 因为上一题单串匹配是KMP+栈,所以这道题多串匹配考虑AC自动机+栈。 开一个栈记录当前没有被弹出的字符。同时记录匹配到了那个节点,在AC自动机上跑匹配即可。 注意有一个方法就是字符串结束标记上直接打上字符串长度这样就不用那么烦。 时间复杂度 代码实现
阅读全文
摘要:这里给三个板子做一个总结 简单版 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(
阅读全文
摘要:题面传送门 题目这个删掉后重新接成字符串很难处理,所以考虑用栈来衔接。 那么可以记录前一个匹配到哪里,然后就可以继续匹配。 时间复杂度 代码实现: #include<cstdio> #include<cstring> using namespace std; int n,m,k,x,
阅读全文
摘要:题面传送门 没有修改,考虑莫队,容易想到一个移动指针时用树状数组维护的的方法,但是过不去。 这种情况就可以考虑莫队二次离线,把询问拆分,分类讨论一下即可。 注意这道题需要维护正反两个离线。注意卡常。注意离线那个树状数组要用域值分块来做到查询。 哦还有这道
阅读全文
摘要:题面传送门 题解区居然没有一个写理论复杂度最优的算法的。那我就来讲一下。 首先显然有一个结论:对于一个,和小于且最大的连线时最优的。因为这样可以为大于当前的提供更优条件。 同时没有修改就可以考虑离线算法,比如莫队。 莫队的增加时就是把当前按照上面
阅读全文
摘要:题面传送门 闲着没事开始清任务计划。 显然单调栈处理出一条列当前的最高的点,然后单调栈向左右拓展找到第一个小于的点,细节处理一下即可。 时间复杂度 代码实现: #include<cstdio> #define min(a,b) ((a)<(b)?(a):(b)) #define ma
阅读全文