欢迎


欢迎来到
图标是清爽葡萄柚汽水(确信)。
题意:长度为n(1e9)的空位有m(1e6)个被#占了不能填,其余的能填任意小写字母,问至少有一对ccf出现在cspark前的字符串数量。
首先这是个计数,要不重不漏,考虑以第一个出现的ccf和ccf后第一个出现的cspark作为特征进行计数,这样就需要求出前i个没出现ccf的数量(紧接着放ccf),这个可以通过dp,很复杂,但是只能n2做,因为是左(在i第一次出现ccf)乘中间(26^空格数)乘右(在j最后一次出现cspark),固定左边,中间也不是等比数列(有#),所以没法On求,只能n2。
直接计数不行,考虑正则表达式匹配,.*ccf.*cspark.*,(.*简化为*),就是*ccf*cspark*,dp[i][j]代表考虑到第i位,最多匹配j位正则表达式的数量。转移方法是类似kmp的失配转移,具体来说,*遇到任意字符转移到下一位c,也就是dp[i][2]=dp[i-1][1]*26,c遇到c转移到下一位c,剩下25转移到*,第二个c遇到f转移到下一位(f位置不会被匹配上,因为定义是最多能匹配到哪一位,.*代表人任意个任意符号,所以在f的必定会转移到),遇到c转移到原地,其他24转移到*……
然后就过了第一个 subtask ,\(O(11n)\)。
1 | #include <bits/stdc++.h> |
然后考虑这两个转移的dp式子很像矩阵运算,所以可以用矩阵快速幂加快运算,#之间的连续的k个空格就用矩阵快速幂加速dp
然后就过了第二个subtask,\(O(11^3m+11^3m\log n)\)
1 | #include <bits/stdc++.h> |
然后我们发现矩阵快速幂里和普通快速幂不一样,矩阵乘法有\(11^3\)复杂度,所以可以预处理矩阵的幂,把矩阵快速幂时间复杂度降下来,变成\(O(11^3m+m\log n)\)
或者我们可以发现,不同的区间长度不会多于根号n,因为长度1+2+3…..是等差数列,所以我记住快速幂得出的答案也可以把这里的时间复杂度降下来。
然后我们发现现在的时间复杂度卡在了1e6的m上,每次#都要算两次113的矩阵操作用来dp,太慢了,所以我们可以从开始维护向量,而不是把矩阵都乘起来再乘向量。所以开始创建一个向量,然后每次遇到#只需要112的向量成矩阵,所以变成了\(O(11^2m+m\log n)\),就可以过了。
1 | #include <bits/stdc++.h> |
期末考试临近了,yz 和 zzw
收到了来自老师的试卷关爱,但是试卷太多了,足足有
\(10^{6}\)
张,他们已经无法排好试卷了。
所以在 zzy 的建议下,他们把这个问题交给了你。
把柱子的点拆成入点出点两部分,它们间的连边的容量就是柱子的高度(能跳出的次数)。
柱子的出点与所有距离 d 以内的柱子的入点和场外点连容量正无穷的边。
源点和有蜥蜴的柱子的入点连容量为 1 的边,场外点和汇点连容量正无穷的边。
树上启发式合并、Kruskal 重构树、神秘康托展开、欧拉路(更新)、Dinic(更新)、cout 输出流控制。
二叉堆主要支持的操作有:插入一个数 \(O(\log n)\)、查询最小值 \(O(1)\)、删除最小值 \(O(\log n)\)。
二叉堆是一棵完全二叉树,其每个节点都有一个值,且每个节点的值都大于等于/小于等于其父亲的值。每个节点的值都大于等于其父亲值的堆叫做小根堆(即根最小),否则叫做大根堆。STL
中的 priority_queue 其实就是一个大根堆。
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.