传送门 换根dp入门题. 貌似李煜东的书上讲过? 不记得了. 先推出以1为根时的答案. 然后考虑向儿子转移. 我们记f[p]f[p]f[p]表示原树中以ppp为根的子树的答案. g[p]g[p]g[p]表示把根换成ppp时整棵树的答案. 于是有g[v]=f[v]+min(g[p]−min(e[i].c,f[v]),e[i].c)g[v]=f[v]+min(g[p]-min(e[i].c,f[v]),e[i].c)g[v]=f[v]+min(g[p]−min(e[i].c,f[v]),e[i].c…
传送门 一道不错的枚举题. 显然桶排序之后瞎枚举一波. 考虑枚举首项和末项,假设首项除去一个最大的平方因子得到的结果为xxx. 那么末项一定等于xxx乘上一个平方数. 于是我们枚举首项,算出xxx然后O(sqrt(amax))O(sqrt(a_{max}))O(sqrt(amax​))枚举末项. 这样算出来应该是正确答案. 注意处理公比为1的情况. 代码…
传送门 期望题. 其实跟dpdpdp关系并不大. 考虑f[i]f[i]f[i]表示已经凑出了iii个需要的次数. 显然有:f[i]=ni∗f[i]+nn−i∗f[i+1]+1f[i]=\frac {n} {i}*f[i]+\frac {n} {n-i}*f[i+1]+1f[i]=in​∗f[i]+n−in​∗f[i+1]+1 那么就有f[i]=f[i+1]+nn−if[i]=f[i+1]+\frac {n} {n-i}f[i]=f[i+1]+n−in​ 所以ans=f[0]=∑i=1nnians…
传送门 f[i][j]f[i][j]f[i][j]表示后iii个对答案贡献有jjj个a的方案数. 可以发现最后a,ba,ba,b的总个数一定是n∗(n−1)/2n*(n-1)/2n∗(n−1)/2 因此直接转移就行了. f[i][j]=f[i+1][j]+f[i+1][j−i]f[i][j]=f[i+1][j]+f[i+1][j-i]f[i][j]=f[i+1][j]+f[i+1][j−i] 解释:要么当前不选,要么选了就会有iii个aaa的贡献. 发现空间有点大?滚动数组优化 代码…
传送门 勉强算一道dp好题. 显然第kkk列和第k+nk+nk+n列放的棋子数是相同的. 因此只需要统计出前nnn列的选法数. 对于前mmm%nnn列,一共有(m−1)/n+1(m-1)/n+1(m−1)/n+1列跟它放的棋子数一定相同. 而对于第mmm%n+1n+1n+1~nnn列,一共有m/nm/nm/n列跟它放的棋子数一定相同. 因此枚举当前在第几列,一共放了几个棋子,然后用背包+快速幂优化转移就行了. 代码…
传送门 组合数学好题. 题目要求输出的结果成功把概率转化成了种类数. 本来可以枚举统计最小值为iii时的概率. 现在只需要统计最小值为iii时的方案数,每一行有不少于iii个1的方案数. 显然一行选i个1的方案数为(mi)∗xm−i∗yi\binom {m} {i}*x^{m-i}*y^{i}(im​)∗xm−i∗yi 于是对于每一行分开考虑最后用快速幂合并就行了. 代码: #include<bits/stdc++.h> #define ll long long using namespace…
传送门 根据题目列出方程: fi=pi∗(fi−1+fi−2)+(1−pi)∗(fi+1+fi)f_i=p_i*(f_{i-1}+f_{i-2})+(1-p_i)*(f_{i+1}+f_i)fi​=pi​∗(fi−1​+fi−2​)+(1−pi​)∗(fi+1​+fi​) 但这会牵扯到iii之后的状态没法做. 因此考虑如果合成失败会变成一个等级为i−2i-2i−2的武器. 相当于消耗了一个等级为i−1i-1i−1的武器. 因此fi=pi∗(fi−1+fi−2)+(1−pi)∗(fi−1+fi)f…
传送门 纯粹是为了熟悉板子. 然后发现自己手生了足足写了差不多25min而且输出的时候因为没开long longWA了三次还不知所云 代码…
传送门 带修莫队板题. 直接按照经典写法做就行了. 代码…
传送门 换根dpdpdp傻逼题好像不好码啊. 考虑直接把每一个二进制位拆开处理. 先dfsdfsdfs出每个点到1的异或距离. 然后分类讨论一波: 如果一个点如果当前二进制位到根节点异或距离为1,那么对于当前二进制位到这个点距离为000的就是到根节点距离为111的,如果当前二进制位到这个点距离为111的就是到根节点距离为000的. 如果一个点如果当前二进制位到根节点异或距离为1,那么对于当前二进制位到这个点距离为000的就是到根节点距离为000的,如果当前二进制位到这个点距离为111的就是到根节…