摘要:
题目链接 抽丝剥茧到最后一步,你离成功解出这道题只剩下“矩阵等比数列求和”这个问题了。把式子写出来:\(M+M^2+M^3+...+M^k\),虽然没办法套用求和公式,但一定有办法的,看着它,用心感受,或者不妨先转移注意力—— 分治!分解原问题为结构相同的子问题,再将子问题的解合并成原问题的解! 分 阅读全文
摘要:
题目链接 只考虑第三问 跳k段可以通过倍增优化,问题转化为,从任意一个点开始,跳1段最多能到哪个点,这是倍增的基础 可以用双指针求,退一步讲,就算你没想到双指针,二分+st表(倍增实现,但不需要跳,首尾闭环O(1)求任意区间最值)也应当可以O(nlogn)地求出来 这里面暗含了预处理的思想,把那些计 阅读全文
摘要:
题目链接 阅读理解题 如果你发现签到题的代码难以实现,那往往是因为你理解错题意了 即使你考0分,只要大家都考0分,你仍然可以成为第一名呀——虽然这很反常识 阅读全文
摘要:
题目链接 由于左右子树不等价,我们可以以Trie树的视角考察原树,发现“叶子节点不超过20个”的条件等价于这棵Trie树可以用不超过20个01字符串表示 树的匹配不好做,但字符串匹配是可做的。于是我们可以想到把树的匹配“折叠”成20个字符串的匹配 猜想时间复杂度是O(20n),其中20是枚举的复杂度 阅读全文
摘要:
题目链接 一个合法的序列可能有多种生成方式,因此我们考虑确定其中唯一的一种 从前往后匹配,只有当某种颜色的充能球的数量达到上限时才切换到下一小时 DP。f[i]表示考虑到第i小时,[j]表示这一小时的第一颗充能球的颜色,也是上一小时达到上限的充能球的颜色 朱世杰恒等式(取的数的多少不变):$C_{m 阅读全文
摘要:
题目链接 考虑最终得到的图是一张“菊花图森林”,我们新增一个节点,向菊花图森林上的点随机连边,就能得到原图 这张原图可能很复杂,不好下手,但目标相对简单,我们考虑得到目标的必要条件 枚举原图中的每一条边(u,v),如果存在x和u相连,y和v相连,这四个点要么形成一条长度>3的链,要么形成一个环,都与 阅读全文
摘要:
题目链接 虽然这道题看起来好像不太能DP的样子,但事实上的确是树形DP,我们考虑每条边怎样被覆盖——而不是被整条路径局限了思维 我们依次用x的每个子树y更新x,在子树中枚举i,i>0时,|i|表示有多少个“超级技能”起点向外扩展,i<0时,|i|表示有多少个“超级技能”起点向内扩展,同时子树内有|i 阅读全文
摘要:
题目链接 开300000个并查集固然会空间超限,但考虑到每个并查集内部都存在着大量的空间浪费,因此你完全可以实现“动态开点”并查集 点击查看代码 #include <bits/stdc++.h> using namespace std; int fa[700005],s[700005],u[3000 阅读全文
摘要:
题目链接 相信OI美学 点击查看代码 #include <bits/stdc++.h> using namespace std; vector<int>a[200005]; int f[200005],s[200005],ansa[200005],ansb[200005]; void dp(int 阅读全文
摘要:
题目链接 题解好抽象……费了好大劲儿才(自认为)勉强看懂代码,也不打算自己重写了,下附自己写的log平方(我的实现可能是立方)代码和题解代码 首先,朴素模拟的复杂度似乎不对,但通过打表找规律可以发现一个优良性质——对于每次合并完的结果,至多有两个长度相同的互异段,于是朴素模拟的复杂度的确是log方的 阅读全文