摘要:Description 小春现在很清闲, 面对书桌上的 $N$ 张牌, 他决定给每张染色, 目前小春只有 $3$ 种颜色: 红色, 蓝色, 绿色. 他询问 Sun 有 多少种染色方案, Sun 很快就给出了答案. 进一步, 小春要求染出 $Sr$ 张红色, $Sb$ 张蓝色, $Sg$ 张绿色. 他
阅读全文
摘要:Solution 想到边权为$1$的情况直接矩乘就可以得出长度$<=t$ 的路径条数, 然后二分check一下即可 但是拓展到边权为$2$,$3$ 时, 需要新建节点 $i+n$ 和 $i+2n$. 从 $i+n$ 到 $i$ 连边, $i+2n$ 到 $i+n$ 连边 若 $dis[j,i]=2$
阅读全文
摘要:Solution 在步伐$pace$比较小的时候, 我们发现用前缀和直接维护会很快 而在$pace$比较大的时候, 则暴力往上跳会最优 设$blo= \sqrt{N}$ 若$pace<=blo$, 则利用前缀和更新, 预处理复杂度$O(N \sqrt{N})$, 查询复杂度$O(1)$ 若$pace
阅读全文
摘要:Solution 另外$ m <=5e5$。 两条最短路的 最长公共路径 一定是若干条连续的边, 并且满足拓扑序。 于是我们分别 正向 和反向走第二条路径,若该条边同时是两条最短路径上的边, 则加入边集。 最后拓扑 求最长链即可 Code 1 #include<cstring> 2 #include
阅读全文
摘要:Solution 离散化 扫描线, 并用 $rest[i]$ 和 $cnt[i]$ 记录 第$i$列 总共有 $cnt[i]$棵常青树, 还有$rest[i]$ 没有被扫描到。 那么 第$i$ 列的方案数 为 $C(rest[i], k) * C(cnt[i]-rest[i], k)$。 乘上行上的
阅读全文
摘要:Solution 实际上就是查询 $u$ 到 $v$ 路径上 边双的个数 $ -1$。 并且题目仅有删边, 那么就离线倒序添边。 维护 边双 略有不同: 首先需要一个并查集, 记录 边双内的点。 在 添加边$(u,v)$时 , 若$u, v$ 已经相连, 那么把 $u, v$ 路径上的点 缩成一个点
阅读全文
摘要:Solution 非常妙的排序啊。。。 仔细想想好像确实能够找出最优解QUQ 先对第一关键字排序, 在$LCT$ 维护第二关键字的最大值 所在的边。 添边时如果$u, v$ 不连通 就直接加边。 如果连通 并且路径上的最大值 大于 当前边 的 第二关键字, 那么可以换掉。 如果 $1$ 和 $N$
阅读全文
摘要:Solution 由于链信息不好直接维护, 所以新建一个节点存储边的权值, 并把这个节点连向 它所连的节点 $u$, $v$ $pushup$中更新维护的 $mx$ 指向路径上权值最大的边的编号。 由于这题是只有删边, 没有添边, 所以可以离线倒序, 把删边变成添边。 Code 1 #include
阅读全文
摘要:Solution $LCT$ 打上 $cut$ , $link$ 和 $finroot$ 即可 Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define rd read() 5 using namespac
阅读全文
摘要:Solution 只需要支持$access$ , $cut$ 和 $link$就可以了。 注意不要$makeroot$。 查询时查询 根节点的左子树大小 $+ 1$ Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4
阅读全文
摘要:Solution Tarjan 点双缩点, 加上树上差分计算。 注意特判。。。 我特判挂了好久呜呜呜 Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector> 5 #define rd r
阅读全文
摘要:Description 定义一个半联通图为 : 对任意的两个点$u, v$,都有存在一条路径从$u$到$v$, 或从$v$到$u$。 给出一个有向图, 要求出节点最多的半联通子图, 并求出方案数。 Solution 先进行一次$Tarjan \ SCC$ 缩点, 得到一个有向无环图, 则半联通子图一
阅读全文
摘要:Solution 答案具有单调性, 显然可以二分答案。 有两个注意点 : 英雄是可以随便走的, 也就是不是网格图。。。 还有坐标不能小于$1$ QAQ 开始时英雄在左下角, 公主在右上角, 我们反过来考虑, 让英雄不能到达公主那。 把每个boss 看作是以其坐标为圆心, $mid$为半径的圆。 这时
阅读全文
摘要:Description 找出$[L, R]$ 区间内有多少数, 各位数字和 能整除原数 Solution 枚举每个可能的数字和, 进行数位DP即可 , 水爆 Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #de
阅读全文
摘要:Solution 发现 $x \ xor \ 2x = 3x$ 仅当 $x$ 的二进制中没有相邻的 $1$ 对于第一个问题就可以进行数位DP 了。 但是对于第二个问题, 我们只能通过递推 打表 来算出答案了。 推公式 打表 可知, 这是一个斐波那契数列, $a_0 = 1, a_1 = 2, a_2
阅读全文
摘要:Solution 我的解法好像很不优美。。。 定义了$4$维数组$f[i][j][pre][k]$ 表示第$i$位, 有$j$个1, 当前位的数字为$pre$,是否比输入大$k$。。。然后进行$DP$即可 看到隔壁的$2$维很惭愧 Code 1 #include<cstdio> 2 #include
阅读全文
摘要:Description 在$[L, R]$找出有几个数满足两个条件 : 1 : 不同时含有$4$ 和 $8$ 2 : 至少有$3$个相邻的数相同 Solution 非常容易的数位DP, $pos$ 为当前第几位, $ex$ 表示是否出现过$4$ 或 $8$, $pre$表示 前面的是几, $num$
阅读全文
摘要:Solution 差分就好了, 在$s_i$ 的点+1, $e_i + 1$ 的点 - 1。 查询的时候注意$l == r$ 要返回 $k * b[l]$ ,而不是$sum[node] $因为当前位置的个数可能大于$k$ 最后再心疼自己因为神奇建树挂死2333, 被大佬喷了( Code 1 #inc
阅读全文
摘要:传送门 Solution 这道数位$DP$看的我很懵逼啊。。。 首先我们肯定要先预处理出 $12$位乘起来的所有的可能情况, 记录入数组 $b$, 发现个数并不多, 仅$1e4$不到。 然后我们考虑算出有多少的$x$ 使得$f(x) = y$, 并记录个数到$ans[y]$ 中。 然后? 然后我就不
阅读全文
摘要:Solution 数位DP板子套上就好了 讲解传送门 Code 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define rd read() 5 #define ll long long 6 using namesp
阅读全文