05 2022 档案

摘要:心理阴影题。考试时写了奇怪的线段树分治,在每个线段树节点上维护单调栈在栈内二分…… 这题注意到两维分别是 \(x,cnt_x\),应该对 \(cnt\) 比较敏感的是它的自然根号性质,由于 \(\sum_{cnt_x}=n\),所以实际上 \(cnt_x\) 的种类只有 \(O(\sqrt n)\) 阅读全文
posted @ 2022-05-30 11:23 cunzai_zsy0531 阅读(110) 评论(0) 推荐(0)
摘要:首先考虑建出 dfs 树,如果一个点的深度 \(\geq \frac{n}{k}\),那么直接输出这个点到根的路径即可。 如果没有点深度 \(\geq \frac{n}{k}\),可以证明这棵树一定有不少于 \(k\) 个叶子(考虑反证法,如果叶子个数少于 \(k\),那么点数最多也不到 \(k\c 阅读全文
posted @ 2022-05-30 11:19 cunzai_zsy0531 阅读(37) 评论(0) 推荐(0)
摘要:考虑问两次,一次 \([1,n]\),一次 \([2,n]\),能够得到什么信息:长度为 \(1\) 的串,第一次询问多出来的串就是 \(s_1\);同理,长度为 \(2\) 的串多出来的两个字符,去掉 \(s_1\) 就是 \(s_2\);依此类推之后,发现可以直接求出所有位置的字符,并且字串总长 阅读全文
posted @ 2022-05-30 11:18 cunzai_zsy0531 阅读(71) 评论(0) 推荐(0)
摘要:首先考虑枚举矩形较小的边,这样每种数选的个数就是确定的了,用它去更新答案。考虑现在已经知道了答案矩形的两边长,那么如何构造出这个矩形:出现次数从大到小往里放,每次沿着一个斜线放下去,如果顶到了边界就换到下一个斜线,这样一定不会出现一个元素出现在同一行或同一列。 点击查看代码 const int N= 阅读全文
posted @ 2022-05-30 09:18 cunzai_zsy0531 阅读(33) 评论(0) 推荐(0)
摘要:考虑根号分治。设 \(m=\sum k_i\),则把 \(k>\sqrt m\) 的称为大集合,\(k\leq \sqrt m\) 的称为小集合。 对于小集合与小集合: 暴力枚举每个集合的每一对 \((x,y)\),开一个哈希表维护有没有其他的集合也存在这个数对。由于集合大小不超过 \(\sqrt 阅读全文
posted @ 2022-05-28 16:26 cunzai_zsy0531 阅读(105) 评论(0) 推荐(0)
摘要:首先可以写出这样一个方程 \[ dp_i=\max_{j<i,a_j\leq a_i}\{dp_j+1+w(i,j)\} \] 其中,\(w(i,j)=0/1\) 表示 \([i+1,j-1]\) 有没有比 \(a_i\) 和 \(a_j\) 都大的数。 考虑维护每个点的 \(pre\) 表示 \( 阅读全文
posted @ 2022-05-28 16:21 cunzai_zsy0531 阅读(88) 评论(0) 推荐(0)
摘要:每次删数都会删恰好 \(k-1\) 个,所以删的数总个数必须是 \(k-1\) 的倍数。考虑最终状态,如果所有数左边不足 \(\frac{k-1}{2}\) 个删掉的数或右边不足 \(\frac{k-1}{2}\) 个删掉的数,那么最后一步是无法实现的。否则,实现了最后一步之后,就可以很轻松的实现前 阅读全文
posted @ 2022-05-28 16:19 cunzai_zsy0531 阅读(40) 评论(0) 推荐(0)
摘要:注意到只要两个人初始的朝向相反就可以看到对方,否则不行。直接把斜率搞成一个 pair 压到 map 里存个数就行了。 点击查看代码 #include<cstdio> #include<iostream> #include<map> #define mp std::make_pair typedef 阅读全文
posted @ 2022-05-28 16:17 cunzai_zsy0531 阅读(43) 评论(0) 推荐(0)
摘要:首先有一个结论,每个人向前走只会走 \(1\) 格,走更多不会更优。感觉应该是挺好证的。然后接下来就可以考虑 dp,设 \(dp_i\) 表示搞完了 \([1,i]\) 的所有 boss,现在在 \(i+1\) 位置的最小时间。有三种转移: 用手枪一个一个打小怪,用狙击枪打boss,走到下一关 用手 阅读全文
posted @ 2022-05-28 15:27 cunzai_zsy0531 阅读(86) 评论(0) 推荐(0)
摘要:考虑不论怎么样,每个子树里边最长的链都会接在别的链下面,因为如果这条链不动,让别的链接过来一定不优。所以就直接按这个排序然后输出 dfs 序就行了。具体证明我也不会,就是考场猜了个结论。 点击查看代码 const int N=1e5+13; int n,son[N],maxd[N],dfn[N],d 阅读全文
posted @ 2022-05-28 15:26 cunzai_zsy0531 阅读(49) 评论(0) 推荐(0)
摘要:一般这种 dp 的转移都是相邻格子之间的,但是这道题相邻格子之间转移没办法搞掉题目的这个限制。考虑每次转向的时候转移,这样对于某一个点,他能转移的一定是一个区间(不能到最后 \(cnt\) 个,那样就把石头推出去了)。暴力做是 \(O(n^3)\) 的,区间的这个可以前缀和优化,就 \(O(n^2) 阅读全文
posted @ 2022-05-28 15:23 cunzai_zsy0531 阅读(38) 评论(0) 推荐(0)
摘要:如果没有敌对关系,枚举一共选 \(i\) 个人,如果有 \(j\) 个人满足 \(i\in [l_j,r_j]\),那么方案数是 \(\binom{i}{j}\)。 接下来考虑限制,由于 \(m\leq 20\),考虑容斥,直接钦定一个集合 \(S\),其中所有为 \(1\) 的位置对应的限制必选, 阅读全文
posted @ 2022-05-28 15:22 cunzai_zsy0531 阅读(59) 评论(0) 推荐(0)
摘要:考虑一个分治:每次如果要用第一种,一定是给整个区间用,直到没有办法覆盖整个区间,用的次数是 \(\min_{i=L}^R a_i\) 次,减去它之后分别递归最小值的两边。注意到如果某一次不使用第一个操作,那么以后也都不会用了,此时操作总数就是不为 \(0\) 的位置个数。复杂度最慢也是 \(O(n^ 阅读全文
posted @ 2022-05-28 15:20 cunzai_zsy0531 阅读(54) 评论(0) 推荐(0)
摘要:首先,抽到一次鬼牌视作一次迭代,那么每次迭代的期望长度是一样的,即 \[ \begin{aligned} E(x)&=1\times\frac{m}{n+m}+2\times\frac{n}{n+m}\times\frac{m}{n+m-1}+\ldots+(n+1)\times(\prod_{j= 阅读全文
posted @ 2022-05-28 15:17 cunzai_zsy0531 阅读(41) 评论(0) 推荐(0)
摘要:考虑如果把同样的一段操作序列同时给两个串做,对答案是没有影响的。所以考虑把每个区间差分成后缀(不能是前缀,因为这样相同的操作序列在前面没法抵消),这样就可以表示区间了。两个串分别的对每个后缀操作之后得到的串可以 \(O(nk)\) 算出来,就是记录每个位置最终会被换到哪里就可以从右向左递推。 算出两 阅读全文
posted @ 2022-05-28 15:14 cunzai_zsy0531 阅读(45) 评论(0) 推荐(0)
摘要:由于一开始的序列中没有两个相同的 \(h\),猜测最终的序列中 \(h_i=h_{i+1}\) 的位置最多只有一个。大概可以这样感性理解:考虑从左到右做“滑坡”,如果之前 \(h_i=h_{i-1}\),那么后面要么 \(h\) 都不相同,要么有一个位置相同了会带动一段都 \(+1\),导致 \(h 阅读全文
posted @ 2022-05-28 15:10 cunzai_zsy0531 阅读(30) 评论(0) 推荐(0)
摘要:一共会走 \(2n-2\) 步,那么钦定第 \(i\) 步向右 \(\Rightarrow\) 和的第 \(i\) 位为 \(1\),向下为 \(0\)。考虑如何构造出满足这个条件的矩阵:假设当前位置 \((i,j)\) 从右下到左上位于第 \(k\) 条斜线,那么这个位置为 \((j-1)(2^k 阅读全文
posted @ 2022-05-28 15:08 cunzai_zsy0531 阅读(36) 评论(0) 推荐(0)
摘要:设 \(c_i=0/1\) 表示 \(i\) 有没有在 \(a\) 中出现,那么这个就是他自己和自己的差卷积,卷出来之后不是 \(0\) 的位置就都可以,每个可以的位置更新一下自己的倍数就行(或者使用狄利克雷前缀和,不过暴力做复杂度也过得去)。 差卷积就翻一下序列然后 FFT 就行了。 点击查看代码 阅读全文
posted @ 2022-05-28 15:04 cunzai_zsy0531 阅读(90) 评论(0) 推荐(0)
摘要:如果当前有 \(sum\) 个可以翻倍,那么考虑可不可以让前 \(sum\) 大的都翻倍。可以当且仅当这 \(sum\) 大的数不全能翻倍下一个数。如果全都能翻倍下一个数,那只能牺牲第 \(sum\) 大的数,最后可以再翻倍一个第 \(sum+1\) 大的。 然后有多次删除插入就用 set 维护一下 阅读全文
posted @ 2022-05-28 15:02 cunzai_zsy0531 阅读(40) 评论(0) 推荐(0)
摘要:把贡献看成边,那么会形成一个树形结构。有一个做法就是在树上做 dp 然后树状数组优化,\(O(n^2\log n)\)。 我的做法是,考虑一个区间 dp,设 \(f_{l,r}\) 表示所有在 \([l,r]\) 内的线段最多选多少个,这样就有一个 \(O(n^3)\) 的 dp。考虑什么情况的转移 阅读全文
posted @ 2022-05-28 14:59 cunzai_zsy0531 阅读(81) 评论(0) 推荐(0)
摘要:对于两种权值的分别贪心维护,最后枚举一种权值选多少个,另一个二分出来,总复杂度 \(2\log\)。 点击查看代码 #include<cstdio> #include<iostream> #include<queue> typedef long long ll; inline int min(con 阅读全文
posted @ 2022-05-28 14:57 cunzai_zsy0531 阅读(44) 评论(0) 推荐(0)
摘要:做完 pkusc2022 day2t3 雀圣之后跑来做这题。 首先我们考虑雀圣那题。那个题是说给你一副 \(13\) 张的手牌,让你算向听数。设 \(dp[i][j][0/1][p1][p2][up][dn]=0/1\) 表示考虑到 \(i\) 花色第 \(j\) 张牌,是否已经有雀头,上张牌剩下 阅读全文
posted @ 2022-05-27 20:43 cunzai_zsy0531 阅读(235) 评论(0) 推荐(0)
摘要:题面 \(k=1\) 的时候就是边数 \(\times 2\) 再减去直径长度。考虑 \(k=2\) 的时候,减去的相当于是选出的两条路径的对称差。考虑一个贪心,第一次取某一条直径一定不会更劣,这个感性理解就好。然后把这个直径的边权都设成 \(-1\) 再跑一遍直径就行了。 点击查看代码 const 阅读全文
posted @ 2022-05-20 12:13 cunzai_zsy0531 阅读(40) 评论(0) 推荐(0)
摘要:题面 原题 \(n\leq 5000\),加强版 \(n\leq 10^5\),实际上能做 \(n\leq 10^6\)。 长链剖分。做这种很多点满足限制的题,套路差不多。设 \(f_{u,i}\) 表示 \(u\) 子树内到 \(u\) 距离为 \(i\) 的点数,\(g_{u,i}\) 表示 \ 阅读全文
posted @ 2022-05-20 12:11 cunzai_zsy0531 阅读(58) 评论(0) 推荐(0)
摘要:题面 需要动态维护一个点集的极小联通子图边权和。可以发现,将点集 \(\{a_i\}\) 中的点按照 dfs 序从小到大排序之后,\(dist(a_1,a_2)+dist(a_2,a_3)+\ldots+dist(a_{k-1},a_k)+dist(a_k,a_1)\) 恰好等于我们要维护的那个边权 阅读全文
posted @ 2022-05-20 12:08 cunzai_zsy0531 阅读(51) 评论(0) 推荐(0)
摘要:题面 基环树,树的部分容易发现,每个点的值都是确定的,也就是所有儿子的值的 \(mex\)。直接对非环部分进行树形 dp,考虑环上部分。由于环上的点都还有一条出边,所以如果环上的点通过树形 dp 求得的答案是 \(x\),那么它有两种可能:\(x\) 和所有儿子加入 \(x\) 后的 \(mex\) 阅读全文
posted @ 2022-05-20 12:07 cunzai_zsy0531 阅读(27) 评论(0) 推荐(0)
摘要:题面 由于乘起来不能是完全立方数,考虑对每个数质因数分解之后,所有的指数都 \(\bmod 3\),这样操作完之后,每个数都与唯一一个数对应(乘起来是完全平方数),即对于每个质因子,如果次数为 \(1\),对应的那个数的次数应该为 \(2\),反之同理。这样可以建立起一个一一映射,对于每个映射都只能 阅读全文
posted @ 2022-05-20 12:05 cunzai_zsy0531 阅读(57) 评论(0) 推荐(0)
摘要:题面 首先考虑没有环的情况,那么答案肯定就是 \(1\) 到 \(n\) 简单路径的边权异或和。如果出现环,设这个环边权异或和为 \(c\),从这条 \(1\) 到 \(n\) 简单路径到这个环的路径边权异或和为 \(k\),那么答案为 \(dis_n\oplus k\oplus c\oplus k 阅读全文
posted @ 2022-05-20 12:04 cunzai_zsy0531 阅读(44) 评论(0) 推荐(0)
摘要:题面 首先求出原数组的前缀 xor 数组 \(s\),这样相当于要在其中找两个值使其 xor 起来最大。 维护一个堆,里面有 \(n\) 个元素,分别为当前与 \(s_i\) 异或最大的数。每次取出来一个就把与当前这个 \(s_i\) 异或次大的数放进去,以此类推即可。使用类似线段树二分的方法可以做 阅读全文
posted @ 2022-05-20 12:02 cunzai_zsy0531 阅读(65) 评论(0) 推荐(0)
摘要:题面 题目中条件等价于给你一个点 \(a\),\(b\) 和 \(a\) 的深度差不能超过 \(w\),\(c\) 要同时在 \(a\) 和 \(b\) 的子树中。 考虑分类讨论: 若 \(b\) 是 \(a\) 的祖先,那么答案为 \(\min(dep_a-1,w)\times (siz_a-1) 阅读全文
posted @ 2022-05-20 12:00 cunzai_zsy0531 阅读(62) 评论(0) 推荐(0)
摘要:题面 首先可以注意到一点:如果这棵树确定了根节点,那么所有的蓝边都只能是爷爷-父亲-儿子这样的边,不可能有儿子-父亲-另一个儿子这样的(建不出来)。 基于上述结论的一个 \(O(n^2)\) dp就是:枚举根节点,设 \(f_{u,0/1}\) 表示 \(u\) 节点子树中,\(u\) 是否作为某一 阅读全文
posted @ 2022-05-20 11:58 cunzai_zsy0531 阅读(65) 评论(0) 推荐(0)
摘要:题面 罕见的数位dp好题。 首先感觉这个题想数位dp有点困难,很多东西都在变。注意到每个数位数字和其实最大也才一百多,考虑枚举这个和,统计被这个和整除且数位和等于这个和的数的个数就完事了。 点击查看代码 #include<iostream> #include<cstdio> #include<cst 阅读全文
posted @ 2022-05-20 11:54 cunzai_zsy0531 阅读(41) 评论(0) 推荐(0)
摘要:题面 这个题是二维的情况,一个点向一个矩形连边。一维的时候就是线段树优化建图,这里只能树套树优化建图了。但是这道题空间只有128MB,显然空间不能达到 \(O(n\log^2 n)\) 级别,所以考虑线段树套平衡树 (set) 来解决。 一个通常用来解决这种问题的方案是,不直接连边,而是把每个矩形在 阅读全文
posted @ 2022-05-20 11:53 cunzai_zsy0531 阅读(67) 评论(0) 推荐(0)
摘要:题面 这题很有意思,正解做法是线段树优化建图之后跑tarjan强连通分量然后在DAG上做一些奇奇怪怪的统计,但是这题有神仙 \(O(n)\) 做法!(虽然我不会证明但是跑的的确很快啊) 说的是,首先注意到先点一个,最后爆炸的炸弹一定是一个区间。所以现在问题转化成了对于每个 \(i\) 求爆炸的左右端 阅读全文
posted @ 2022-05-19 16:58 cunzai_zsy0531 阅读(29) 评论(0) 推荐(0)
摘要:题面 dp有后效性,转移看作边之后会成环。这时候一般需要建出图来跑最短路。 这道题的最短路有些不一样,方程为 \(f_i=\max(a_i,b_i+\sum\limits_j f_j)\),比较像最短路的松弛操作。spfa每次从队列里取出 \(u\) 来之后,遍历所有相邻点 \(v\),记录一个和, 阅读全文
posted @ 2022-05-19 16:51 cunzai_zsy0531 阅读(38) 评论(0) 推荐(0)
摘要:题面 看起来就很像是一道数位dp,\(L\) 和 \(R\) 很大,并且限制和大小没关系。考虑状态的设计:剩余长度 \(len\),是否有上限限制 \(lim\),这两个肯定是必须的。因为要统计连续三个位置相同,所以要记录 \(pre1,pre2\) 表示前两位是什么数(当然也可以记录上一位和它们两 阅读全文
posted @ 2022-05-19 16:49 cunzai_zsy0531 阅读(57) 评论(0) 推荐(0)
摘要:题面 开一棵线段树,区间内合并左右儿子的时候,如果颜色相同则赋成此颜色,否则直接赋成 \(0\),第三个操作只需要区间 \([l,r]\) 答案不为 \(0\) 且两边颜色不一样即可。比较简单,复杂度 \(O(n\log n)\)。 点击查看代码 #include<iostream> #includ 阅读全文
posted @ 2022-05-19 16:39 cunzai_zsy0531 阅读(43) 评论(0) 推荐(0)
摘要:题面 前两个操作放过来看似是一道线段树题,但是发现线段树无法维护第三个操作。考虑使用平衡树(fhqtreap)来解决这个问题,前两个操作和线段树差不多,直接split出来打加法和乘法标记即可。第三个操作大概就是把 \(R\) 位置的系数加到 \(R+1\) 位置并且删除,在 \(L\) 的左边加一个 阅读全文
posted @ 2022-05-19 16:37 cunzai_zsy0531 阅读(36) 评论(0) 推荐(0)
摘要:题面 考虑异或可以表示成前缀和的形式,则 \(a[p]\oplus a[p+1]\oplus\ldots \oplus a[n]\oplus x=s[p-1]\oplus s[n] \oplus x\)。后面都是知道的,所以可以拿着 \(s[n]\oplus x\) 的值去01-trie上做匹配。注 阅读全文
posted @ 2022-05-19 16:28 cunzai_zsy0531 阅读(51) 评论(0) 推荐(0)
摘要:题面 考虑把操作时间当作下标建立线段树,每次操作要么是单点修改为 \(x\),要么是修改为 \(1\)。输出答案就是输出线段树根节点的答案。 点击查看代码 #include<iostream> #include<cstdio> using namespace std; const int N=1e5 阅读全文
posted @ 2022-05-19 16:24 cunzai_zsy0531 阅读(30) 评论(0) 推荐(0)
摘要:题面 本来就是个裸的KMP,但是这个题是有删除的,所以可以维护一个栈,每次的 \(j\) 都继承栈顶元素的 \(j\),然后如果找到了一个匹配,就直接弹栈即可。因为只会进栈 \(O(n)\) 次,所以总复杂度也是 \(O(n)\) 的。这个题算是栈的妙用了。 点击查看代码 #include<iost 阅读全文
posted @ 2022-05-19 16:22 cunzai_zsy0531 阅读(74) 评论(0) 推荐(0)
摘要:题面 使用点分治的思想,对每个子树以中心为根dfs一遍算出 \(b,d\) 数组,然后把 \(a\) 数组(子树内所有点)按照 \(d\) 从小到大排序,用两个指针 \(l,r\) 扫数组。注意到这个题需要算个数,所以还需要考虑把在同一个子树内的删掉。另外开一个数组 \(c_i\) 动态维护 \([ 阅读全文
posted @ 2022-05-19 16:16 cunzai_zsy0531 阅读(63) 评论(0) 推荐(0)
摘要:题面 这个题相当于是把每个数的值作为 \(x_i\),在原序列中的位置为 \(y_i\),建出笛卡尔树,直接输出先序遍历(字典序最小)即可。 点击查看代码 #include<iostream> #include<cstdio> using namespace std; inline int rd() 阅读全文
posted @ 2022-05-19 16:13 cunzai_zsy0531 阅读(38) 评论(0) 推荐(0)
摘要:题解 李超树维护直线,求单点最值。维护线段和直线的区别是,线段只是对一段区间有贡献,在线段树上这一段区间需要对应 \(O(\log n)\) 个节点,然后再往下传 \(O(\log n)\) 次,所以复杂度是两个 \(\log\) 的。直线只需要对整个区间进行这个操作,复杂度是 \(1\log\)。 阅读全文
posted @ 2022-05-19 16:10 cunzai_zsy0531 阅读(53) 评论(0) 推荐(0)
摘要:题面 历史最值线段树。考虑到每个区间的操作大概是这样:先是一些加法操作,然后有一次赋值,在这次赋值之后所有的操作都可以表示成赋值。所以维护两类标记,一类表示前面的加法,另一类表示赋值,记录一下这个点有没有开始赋值即可。代码及其难调,建议理清思路再写…… 点击查看代码 #include<iostrea 阅读全文
posted @ 2022-05-19 16:08 cunzai_zsy0531 阅读(57) 评论(0) 推荐(0)
摘要:题面 基本上所有树剖题都可以用LCT维护。两种思路,一种是直接暴力地维护每个点表示的区间的左右端点颜色和颜色段数,另一种是把连接同种颜色的边边权设为 \(0\),不同种颜色设为 \(1\),然后维护路径和即可。 一个注意的点在于LCT中的 \(tag\) 是对所有跟左右有关的值进行取反的标记。一定不 阅读全文
posted @ 2022-05-18 21:49 cunzai_zsy0531 阅读(38) 评论(0) 推荐(0)
摘要:题面 对模式串建广义SAM,对于每个匹配串,首先求出 \(sl_i\) 表示以 \(i\) 为结尾的后缀的最长匹配长度。设 \(dp_i\) 表示 \(1\sim i\) 的最长匹配长度和,二分答案 \(mid\) 之后,有如下 dp 方程: \[ dp_i=\max(dp_{i-1},\max_{ 阅读全文
posted @ 2022-05-18 21:41 cunzai_zsy0531 阅读(33) 评论(0) 推荐(0)
摘要:题面 统计一个后缀和数组 \(suf_i\),其中 ) 为 \(1\),( 为 \(-1\),那么一个子串 \(s_{l,r}\) 是一个合法括号序列,当且仅当 \(\min_{l\leq k \leq r}suf_k\geq suf_{r+1}\),并且 \(suf_l=suf_{r+1}\)。 阅读全文
posted @ 2022-05-18 21:35 cunzai_zsy0531 阅读(112) 评论(0) 推荐(0)
摘要:题面 把所有叶子拎起来当根,合并成一棵trie之后建广义 SAM(我直接每个叶子直接跑的,每次 \(lastpos\) 重置,也可过)。 点击查看代码 const int N=1e5+13,M=2e6+13; int n,m,nxt[M<<1],len[M<<1],ptot=1; std::vect 阅读全文
posted @ 2022-05-18 21:25 cunzai_zsy0531 阅读(42) 评论(0) 推荐(0)
摘要:题面 对 \(n\) 个串建广义 SAM,每个点开一棵线段树维护 parent 树子树内的所有点都被哪些串走到过。这个直接线段树合并即可。注意分裂出来的点也需要update(我也不知道为何,反正不update会WA)。 点击查看代码 const int N=5e5+13,M=5e5+13,logN= 阅读全文
posted @ 2022-05-18 21:23 cunzai_zsy0531 阅读(44) 评论(0) 推荐(0)
摘要:题面 虽然 \(n,m\leq 5000\),但是这题是 \(O((n+m)|\Sigma|)\) 的。首先建 \(S\) 的 SAM,拿 \(T\) 上去跑可以得到 \(T\) 每个前缀的匹配区间(在 \(S\) 中只出现一次)。接着建 \(T\) 的 SAM,也可以求出每个前缀在 \(T\) 中 阅读全文
posted @ 2022-05-18 21:17 cunzai_zsy0531 阅读(60) 评论(0) 推荐(0)
摘要:题面 循环同构的话很容易想到把串延长一倍,跑的时候找所有长度为 \(n\) 的公共子串的出现次数即可。 点击查看代码 const int N=3e6+13; char s[N<<1]; int nxt[N<<1],len[N<<1],ptot=1,lastpos=1,cnt[N<<1]; std:: 阅读全文
posted @ 2022-05-18 21:13 cunzai_zsy0531 阅读(52) 评论(0) 推荐(0)
摘要:题面 对 \(T\) 建 SAM,拿 \(S\) 进去跑,可以得到每个 \(S\) 的前缀 \(S_i\) 的最长匹配后缀长度 \(sl_i\)。那么对于一个询问 \([l,r]\),答案就是 \(\max_{l\leq i\leq r}\{\min(sl_i,i-l+1)\}\)。 里面这个 \( 阅读全文
posted @ 2022-05-18 21:08 cunzai_zsy0531 阅读(43) 评论(0) 推荐(0)
摘要:题面 本质不同第 \(k\) 小。对 SAM 上每个点求一个 \(b_i\) 表示从这个点开始往后走能走到的本质不同的子串个数。然后拿 \(k\) 在自动机上跑即可。 点击查看代码 const int N=9e4+13; char s[N]; int nxt[N<<1],len[N<<1],ptot 阅读全文
posted @ 2022-05-18 21:07 cunzai_zsy0531 阅读(43) 评论(0) 推荐(0)
摘要:题面 拿出出现次数为 \(k\) 的点,给这个点表示的长度区间 \(+1\),这个可以使用差分解决。 点击查看代码 const int N=1e5+13; char s[N]; int nxt[N<<1],len[N<<1],ptot,lastpos,ind[N<<1]; ll cnt[N<<1], 阅读全文
posted @ 2022-05-18 21:01 cunzai_zsy0531 阅读(65) 评论(0) 推荐(0)
摘要:题面 给一个串建 SAM,另一个串在上面跑。 点击查看代码 const int N=2.5e5+13; char s[N],t[N]; int nxt[N<<1],len[N<<1],ptot=1,lastpos=1; std::unordered_map<int,int> son[N<<1],bo 阅读全文
posted @ 2022-05-18 20:48 cunzai_zsy0531 阅读(32) 评论(0) 推荐(0)
摘要:题面 每个点 \(u\) 代表 \(len_ u-len_{nxt_u}\) 这么多串。这个也可以 DAWG dp 求得,不过太麻烦了。 点击查看代码 const int N=1e5+13; int n,nxt[N<<1],len[N<<1],lastpos=1,ptot=1; char s[N]; 阅读全文
posted @ 2022-05-18 20:46 cunzai_zsy0531 阅读(31) 评论(0) 推荐(0)
摘要:题面 拆出来的点贡献为 \(0\),其他贡献为 \(1\),在 DAWG 上统计一个后缀和即可。 点击查看代码 const int N=1e6+13,M=26; int n,len[N<<1],nxt[N<<1],ptot=1,lastpos=1,ind[N<<1]; ll cnt[N<<1]; s 阅读全文
posted @ 2022-05-18 20:41 cunzai_zsy0531 阅读(47) 评论(0) 推荐(0)
摘要:题面 当年见这题的时候还是初三的年轻选手。现在已经是老选手了…… 考虑推式子: \[ \begin{aligned} &\ \ \ \ \ \sum_T (\sum_{i=1}^{n-1}w_{e_i})\times\gcd_{i=1}^{n-1}w_{e_i}\\ &=\sum_T \big(\s 阅读全文
posted @ 2022-05-18 20:35 cunzai_zsy0531 阅读(33) 评论(0) 推荐(0)
摘要:题面 板子。注意模数不是质数的 \(\det\): inline int det(int n){ int res=1;bool flag=0; for(int i=1;i<=n;++i) for(int j=i+1;j<=n;++j){ while(a[i][i]){ int tmp=a[j][i] 阅读全文
posted @ 2022-05-18 20:31 cunzai_zsy0531 阅读(22) 评论(0) 推荐(0)
摘要:题面 这题挺有意思的。平常的矩阵树定理求的是 \[ \sum_T\prod_{e\in T}w_e \] 这题要求 \[ \begin{aligned} \sum_T\prod_{e\in T}p_e\prod_{e\not\in T}(1-p_e) &=\sum_T(\prod_{e\in T}p 阅读全文
posted @ 2022-05-18 20:29 cunzai_zsy0531 阅读(36) 评论(0) 推荐(0)
摘要:题面 模板题。直接容斥+矩阵树。复杂度 \(O(2^{n-1}(n-1)^3)\) 可以通过。 阅读全文
posted @ 2022-05-18 20:28 cunzai_zsy0531 阅读(20) 评论(0) 推荐(0)
摘要:题面 一个显然的做法是树剖之后dfs序线段树套时间线段树,直接做的复杂度是 \(O(n\log^3 n)\)。其实也可以把询问离线下来,做一个线段树分治,用树套树维护。 这样做比较麻烦,所以考虑另外一种思路:二分答案。因为有很多询问,不妨放在一起二分,所以可以想到整体二分。使用类似树上差分的思想,对 阅读全文
posted @ 2022-05-18 20:26 cunzai_zsy0531 阅读(40) 评论(0) 推荐(0)
摘要:题面 比较经典的带修树上第 \(k\) 大问题。通常的做法是树剖树套树然后树上二分,一般3到4个 \(\log\)。这个题还可以用整体二分解决。 思考一下这道题目的整体二分过程:二分一个答案 \(mid\),把所有的 \(>mid\) 的修改放到一个数据结构里,然后查询树上路径和。这显然可以使用树剖 阅读全文
posted @ 2022-05-18 20:21 cunzai_zsy0531 阅读(44) 评论(0) 推荐(0)
摘要:题面 \(q\) 次查询矩形第 \(k\) 小。考虑使用整体二分,二分一个值 \(mid\),矩形中小于等于 \(mid\) 的数设为 \(1\),大于 \(mid\) 的数设为 \(0\),统计每个询问的矩形中的和,若大于等于 \(k\),表示答案应该在 \([L,mid]\) 范围内,放到左边继 阅读全文
posted @ 2022-05-18 20:10 cunzai_zsy0531 阅读(67) 评论(0) 推荐(0)
摘要:题面 平面上两个操作:给一些坐标加权和查询矩形点权和。坐标 \(x,y\leq 2\times 10^6\),加权操作最多 \(1.6\times 10^5\) 个,查询操作最多 \(10000\) 个。 感觉时间和 \(x,y\) 大概能构成个三维偏序,直接上 cdq 分治。矩形查询看起来不是很好 阅读全文
posted @ 2022-05-18 20:06 cunzai_zsy0531 阅读(36) 评论(0) 推荐(0)
摘要:题面 考虑整体二分。solve(L,R,l,r) 表示解决的子问题为答案区间在 \([L,R]\) 内的所有问题 \(q_l...q_r\)。边界条件很容易,主要是考虑如何二分。\([L,R]\) 这一维相当于是描述的时间,那么考虑一个 \(mid\),然后把所有 \([L,mid]\) 时刻的修改 阅读全文
posted @ 2022-05-18 20:03 cunzai_zsy0531 阅读(41) 评论(0) 推荐(0)
摘要:这是我第二次参加省选,也是最后一次。 去年来时,被两天的A打爆了,总分全校垫底,只得了 rk61。 今年走时,两天爆力基本打满,以为没切掉 day2A 要退役了,没想到,被命运送进了队里…… 通过去年的sdoi我预计今年也需要拿差不多 300 才能进。但是我觉得我拿 300 很困难…… Day 0 阅读全文
posted @ 2022-05-16 15:09 cunzai_zsy0531 阅读(622) 评论(1) 推荐(1)
摘要:题面 跟暴力写挂有点像,但是这次是三棵树的距离之和最大。考虑在第一棵树上点分治,合并两个儿子子树,求其中的最大值。这个过程可以合并果子,花费 \(1\log\)。在合并的时候拿出这些点来在第二棵树上建虚树,在虚树上 dp,每个位置维护子树内分别在要合并的两个子树(设为 \(0,1\))的直径(包括第 阅读全文
posted @ 2022-05-13 23:01 cunzai_zsy0531 阅读(84) 评论(0) 推荐(0)
摘要:题面 这题感觉思路比较正常。首先考虑化式子,原式需要在两棵树上分别求 \(lca\),这很不好。考虑把式子写成 \[ \frac{1}{2}\big(dis_1(x,y)+dep_1(x)+dep_1(y)-2\times dep_2(LCA_2(x,y)\big) \] 对于这个 \(dis_1\ 阅读全文
posted @ 2022-05-11 19:04 cunzai_zsy0531 阅读(72) 评论(0) 推荐(0)
摘要:题面 这题真的非常 nb! 如果我们不管这个加叶子的操作,只考虑统计答案:每一次统计和点 \(i\) 能够成对的个数。这个可以用点分树做。注意到那个条件 \(dist(i,j)\leq r_i+r_j\) 相当于 \(dist(i,l)-r_i\leq r_j-dist(j,l)\),每个点统计到这 阅读全文
posted @ 2022-05-11 19:01 cunzai_zsy0531 阅读(110) 评论(0) 推荐(0)
摘要:题面 设 \(sum_u\) 为 \(u\) 子树内 \(d\) 的和,\(sum_d\) 和 \(sum_ch\) 意义是常见点分树容斥,记录子树内 \(d\times dist\) 的和。 首先注意一个性质:假设当前答案为 \(u\),那么如果 \(u\) 的某个儿子 \(v\) 的答案更优,那 阅读全文
posted @ 2022-05-11 18:56 cunzai_zsy0531 阅读(55) 评论(0) 推荐(0)
摘要:题面 这个题没有修改操作,所以不需要开线段树。跟平常的动态点分治做法一样,每个点开两个 vector 按照 \(x_i\) 排序存储到这个点和到这个点在点分树父亲的距离。每次找一个点的时候,暴力跳点分树父亲,直接在 vector 上二分查找满足 \([l,r]\) 这个区间的点和距离,直接计算即可。 阅读全文
posted @ 2022-05-11 18:52 cunzai_zsy0531 阅读(75) 评论(0) 推荐(0)
摘要:题面 动态点分治模板题。考虑建出点分树来之后,在每个点开两棵动态开点线段树,以距离为下标,\(t1\) 记录的是 \(u\) 连通块内到 \(u\) 所有距离为 \(i\) 的点的权值和,\(t2\) 记录的是 \(u\) 连通块内到点分树上 \(u\) 的父亲 \(fa_u\) 所有距离为 \(i 阅读全文
posted @ 2022-05-11 18:50 cunzai_zsy0531 阅读(49) 评论(0) 推荐(0)
摘要:题面 从点分治训练题点过来的,发现可以用树形dp……具体做法就是说,设 \(f_{u,0/1/2}\) 表示点 \(u\) 的子树中(包含点 \(u\)),距离 \(\mod 3\) 值为 \(0/1/2\) 的点数。转移和求答案都是 \(O(1)\) 的,总复杂度 \(O(n)\)。 通过这个题可 阅读全文
posted @ 2022-05-11 18:48 cunzai_zsy0531 阅读(31) 评论(0) 推荐(0)
摘要:题面 感觉和板子差不多,但是仔细思考一下就会发现,用两个指针扫的时候很难维护 “不选某个子树”的最小值。这时候需要设计一个排序和贪心方案,使得能够使用模板那种双指针方式解决问题。 首先是几个定义:在对于某个根 \(rt\) 更新答案的时候,设 \(a[]\) 表示子树的所有点,\(b[]\) 表示每 阅读全文
posted @ 2022-05-11 18:45 cunzai_zsy0531 阅读(75) 评论(0) 推荐(0)
摘要:题面 原始式子是 \[ sum_{k,l,r}=\left\{ \begin{aligned} \sum_{i=l}^r a_i&,k=1\\ \sum_{i=l}^r\sum_{j=i}^rsum_{k-1,i,j}&,k\geq 2\\ \end{aligned} \right. \] 考虑求每 阅读全文
posted @ 2022-05-11 18:40 cunzai_zsy0531 阅读(102) 评论(0) 推荐(0)
摘要:题面 推式子+二项式定理+FFT。这个题需要一点生成函数的知识。 首先考虑前缀和,求一个多项式 \(F(x)\) 的前缀和相当于是卷上了一个系数全是 \(1\) 的多项式。即 \[ \begin{aligned} Sum(x)&=F(x)\times \sum_{i=0}^{\infty}x^i\\ 阅读全文
posted @ 2022-05-11 18:36 cunzai_zsy0531 阅读(63) 评论(0) 推荐(0)
摘要:题面 又是一道推式子+FFT。看到有些式子看起来很卷,不要犹豫,自信一点,说不定就推出来了呢。 设加的数为 \(x\),转完之后两个数组每一位对应为 \(a[1...n]\) 和 \(b[1...n]\),可得: 要求 \(\min\{\sum_{i=1}^{n}(a_i+x-b_i)^2\}\): 阅读全文
posted @ 2022-05-11 18:32 cunzai_zsy0531 阅读(36) 评论(0) 推荐(0)
摘要:题面 看这个题目的式子,好像就是最近学的库仑定律+电场强度??做法推式子FFT。 考虑首先通过 \(E_i=\frac{F_i}{q_i}\) 消掉原式中的一些量。得到: \[ E_i=\sum_{i=0}^j\frac{q_i}{(i-j)^2}-\sum_{i=j}^n\frac{q_i}{(i 阅读全文
posted @ 2022-05-11 18:30 cunzai_zsy0531 阅读(52) 评论(0) 推荐(0)
摘要:一棵树点有点权,支持换根、路径修改、查询子树最小值。\(n\leq 10^5\)。 这个换根其实就是,查询最小值的时候,判断一下查询点 \(x\) 相对于 \(root\) 的位置。如果 \(root\) 在 \(x\) 的子树里,就在 dfs 序里把 \(root\) 子树扣出去就行了。 我这个代 阅读全文
posted @ 2022-05-04 13:06 cunzai_zsy0531 阅读(54) 评论(2) 推荐(0)
摘要:Post time: 2021-10-24 12:31:23 待到秋风萧瑟时,你是否有勇气在最后一战拼到最后一刻? Day -1 上午的 ZR 模拟出分了,我又考了全机房垫底。连续两天挂了总共 200 分,让我对 CSP 的比赛感到非常紧张。不知道是什么原因,最近的比赛能够拿到期望得分的场越来越少了 阅读全文
posted @ 2022-05-03 17:52 cunzai_zsy0531 阅读(58) 评论(0) 推荐(0)
摘要:Post time: 2021-04-11 17:17:31 算是第一次参加省选吧。居然已经是中年选手了。然而,却没有一个中年选手应有的水平,是为什么呢? update 2021.6:我左边的小哥竟然是whq!!!update 2022.1:一年后的SD队长!!!/bx/bx/bx Day 0 月考 阅读全文
posted @ 2022-05-03 17:47 cunzai_zsy0531 阅读(78) 评论(0) 推荐(0)
摘要:Post time: 2021-02-05 14:39:55 所以我的WC2021,也就是SDOI2021之旅,就这么结束了? 好像是的。未来的路还很长,但似乎离退役不远了呢…… Day -1 终于把冬令营day2老师讲的扩展KMP学完了,当时讲完准备一气把字符串通关,但发现似乎高估自己了…… 讲课 阅读全文
posted @ 2022-05-03 17:41 cunzai_zsy0531 阅读(77) 评论(0) 推荐(0)
摘要:Post time: 2020-12-08 12:38:44 本人今年高一,去年八月开始系统学习OI,去年十一月以 193 的成绩混了个tg压线省一……然后一年之后,这条路似乎到了头? Day -n CSP2020出分了,我只考了180pts,在机房几乎垫底……这个状态的话别说省队,省一也混不上了啊 阅读全文
posted @ 2022-05-03 17:39 cunzai_zsy0531 阅读(43) 评论(0) 推荐(0)
摘要:基本设置 problem.conf 中一行只能含有一个设置(不然可能会出现奇怪的错误?) use_builtin_judger 大多数题的 problem.conf 里都要有 use_builtin_judger on 这句话,这表示您需要使用 OJ 自带的评测系统来评测这道题。 如果您出了一道奇奇 阅读全文
posted @ 2022-05-03 17:35 cunzai_zsy0531 阅读(656) 评论(0) 推荐(0)
摘要:Post time: 2022-02-17 14:11:52 本篇文章借鉴于武汉二中吕凯风的2015集训队论文《集合幂级数的性质与应用及其快速算法》。 一、声明 我们令全集为有限集 \(U=\{1,2,...,n\}\),其中 \(n=|U|\),设所有未标明的 \(S\) 都是 \(U\) 的子集 阅读全文
posted @ 2022-05-03 17:32 cunzai_zsy0531 阅读(353) 评论(0) 推荐(0)
摘要:Post time: 2022-02-06 11:59:16 基础内容 链接 update: 最小圆覆盖 震惊我一年的随机增量法…… 定理 1:如果第 \(i\) 个点不在前 \(i-1\) 个点的最小圆覆盖 \(C\) 中,那么这个点一定在前 \(i\) 个点的最小圆覆盖上。 根据这个定理我们有了 阅读全文
posted @ 2022-05-03 17:23 cunzai_zsy0531 阅读(58) 评论(0) 推荐(0)
摘要:Post time: 2021-12-18 15:07:40 借鉴一下 M67 的文章,不过不知道为什么没有显示全…… 什么是生成函数? 我们年级有许多漂亮的MM。一班有 \(7\) 个左右吧,二班大概有 \(4\) 个,三班最多,\(16\) 个,四班最可怜,一个漂亮的MM都没有,五班据说有 \( 阅读全文
posted @ 2022-05-03 17:14 cunzai_zsy0531 阅读(116) 评论(0) 推荐(0)
摘要:Post time: 2021-11-23 17:11:25 一、群的定义 一个群是一个集合 \(G\) 加上对 \(G\) 的二元运算。二元运算用 \(\cdot\) 表示。 群公理包含下述四个性质,若 \(G\not= \varnothing\),其与在 \(G\) 上的运算 \(\cdot\) 阅读全文
posted @ 2022-05-03 16:59 cunzai_zsy0531 阅读(340) 评论(0) 推荐(0)
摘要:Post time: 2021-05-18 16:48:40 整体二分 模板题:$q$ 次查询区间第 $k$ 小,带单点修改。$n,q\leq 10^5$。 考虑如果只有一次询问,有一个做法是考虑在值域 $[L,R]$ 上二分答案 $mid$,把所有 $\leq mid$ 的数设为 $1$,否则设为 阅读全文
posted @ 2022-05-03 16:42 cunzai_zsy0531 阅读(58) 评论(0) 推荐(0)
摘要:LGV 引理 应用于 DAG。 设 \(\omega(P)\) 表示 \(P\) 路径各边的边权乘积。\(e(u,v)\) 表示从 \(u\) 到 \(v\) 所有路径的 \(\omega\) 之和。起点点集 \(A\) 和终点点集 \(B\) 的大小都是 \(n\)。一组 \(A\to B\) 的 阅读全文
posted @ 2022-05-03 16:36 cunzai_zsy0531 阅读(87) 评论(0) 推荐(0)
摘要:Post time: 2021-04-06 18:41:58 说在前面 省选前攒一波 $rp$,冲几发数据结构吧…… update 2021.4.12:SDOI2021黑了…… rp--可还行。 LCT $Link-Cut\ Tree$,动态树,可以动态维护一棵树或者一个森林。主要思想是实链剖分,S 阅读全文
posted @ 2022-05-03 16:30 cunzai_zsy0531 阅读(79) 评论(0) 推荐(0)
摘要:分块之后,一定要注意你操作之后的数组并不是修改的区间! 点击查看代码 #include<cstdio> #include<iostream> #include<cstring> #include<queue> #include<stack> #include<algorithm> #include< 阅读全文
posted @ 2022-05-03 13:26 cunzai_zsy0531 阅读(33) 评论(0) 推荐(0)