当前搜索:
fi,jf_{i,j}表示长为 ii 的区间 最大值是jj 的答案
转移就枚举最左边的最大值在区间的位置 前缀和优化下就好了好像也可以fi,j,kf_{i,j,k}表示前 ii 个,末尾 KK 个中最大值在 jj ,最大值是 kk,有点复杂?#include<cstdio>
#inc...
DP的转移是一个子集和的形式
直接做是3183^{18}
按照高9位 低9位分块可以做到29×39=692^9\times 3^9=6^9#include<cstdio>
#include<cstdlib>
#include<algorithm>
using...
另解:四边形不等式优化考虑这个最优解关于段数是凸的,那么我们不限制段数,而是给每段一个额外的权值,随着这个权值单调变化,最优解的段数也会单调变化,二分出最优解是 mm 段就好了
这个的本质是二分出那个凸函数在 mm 上的斜率然后这个dp是满足决策单调性的 复杂度O(nlog2n)O(n\log ...
好水的E题
f[i][j]表示删完[i,j]区间的最大收益
g[i][j] 表示把[i,j]删成a[i], a[i]+1, a[i]+2 …a[j]的最大收益
h[i][j]类似g[i][j],递减
f[i][j] <- g[i][k]+h[k][j]+v[2*...
这个题无话可说
fi,j,k,tf_{i,j,k,t}表示第 ii 位,AC自动机上走到 jj ,当前得分为 kk ,是否小于上界 tt ,
复杂度看着很高,其实跑不满?#include<cstdio>
#include<cstdlib>
#include<alg...
阿爷教导我
∑∞i=0(Ai)∗(A+B−iA),A=x+y2,B=x−y2\sum _{i=0}^\infty \dbinom{A}{i}*\dbinom{A+B-i}{A},A={x+y\over 2},B={x-y\over2}
然后就是数位dp+lucas定理的套路了
注意有减法要...
大概可以推出来转移是
fx=∑d|xμ(d)∑⌊P−1d⌋i=1gid=∑d|xμ(d)G(d)f_x=\sum_{d|x}\mu(d)\sum_{i=1}^{\lfloor {P-1\over d}\rfloor} g_{id}=\sum_{d|x}\mu(d)G(d)
转移是O(nlnn)...
首先解决依赖背包
如果是0/1背包,按照后序遍历dp,根据选或不选决策
现在是多重背包,那么这个点只留一个,剩下的变成一个新点挂上去,这样仍然满足依赖关系,
转移的时候多重背包用单调对列优化可以发现如果除了最长的一条链,剩余最多KK个
因为权值为正 那么最长链必然连到叶子,剩余必然取KK个...
预先DP一遍则每个格子最多留一个球,然后对轮廓线的状态装压
如果定义一个点的状态数不超过SS 那么据题解说SS大概是5×1055\times 10^5
复杂度O(nmS)O(nmS)
接下来是卡常时刻
我先是把轮廓线上的球数转化成一个80进制数 然后和当前已经入袋的球数hash在一起 ha...
记录f(i,j)是不是A/B的前缀,需要保留前m个dp值
其实就是轮廓线
复杂度O(nm∗4m)O(nm*4^{m})// BEGIN CUT HERE
#include<conio.h>
#include<sstream>
// END CUT HERE
#i...
我们令fi,jf_{i,j}表示TiT_i和SjS_j的LCS
然后我们发现 fi,j−fi,j−1∈[0,1]f_{i,j}-f_{i,j-1} \in [0,1] 这个东西可以状压
预处理所有转移 然后DP#include<cstdio>
#include<cstdlib...
因为都经过根 那么只要考虑根的那么些子树就好了
然后要求 a-b之间是n/2个点 c-d之间是n/2个点
四个点的顺序是 a-c-b-d 或 a-d-b-c
那么背包做一下就好了
If solution of both knapsacks exists, then answer is ...
考虑求lis的过程
fif_i表示长度为ii的递增子序列最末尾一项的最小值 这个东西是单调递增的
每次在序列后加入一个数 就更新下相应的一个位置
现在变成加入的数可以是一个区间内 那么我们发现会对一段产生影响 平衡树维护下就好了#include<cstdio>
#include...
这个东西就是(x−1) xor (y−1)+1(x-1) \ \text {xor} \ (y-1)+1
然后转化为 ∑i∑j[i xor j≤k]\sum_i\sum_j [i \ \text {xor} \ j \leq k]和∑i∑j[i xor j≤k]∗(i xor j)\sum_i\...
骗一波访问
出门右转 #include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
using namespace std;
typedef lon...
怎么跟这个题这么像啊
容斥一下 用没有限制的 减去 一个质数都不选的
复杂度O(p2logn)O(p^2\log n)#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cst...
就是求 nknk 个物品里面取 模kk余rr 个物品的方案数
这个直接dp fi,jf_{i,j}表示前 ii 个 余 jj 个的方案数
矩阵快速幂是O(k3logn)O(k^3\log n)
实际上这个转移满足结合律 直接在快速幂的时候转移就好了
另一种理解是 这个矩阵是循环矩阵 矩阵...
这是个多重背包 直接做肯定接受不了时间复杂度
我们看当体积大于 n√\sqrt n 时 是用不完的 是个完全背包
但还是接受不了复杂度 再观察 体积大的总共只可能取n√\sqrt n个
令fi,jf_{i,j}表示拿了 ii 个 总体积为 jj 的方案数
这样转移 每次全部加1 或者新加入...
瞎DP一下就好了 不过是搞得我蛮昏的
我懒 找一篇题解就当做我写过题解了#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;inline char nc(){
...
陕西出出来的好题
题解注意一个边双可以拆成一条链和一个小边双 然后就可以了
f[i]:集合状态为i.且使在i中的点双联通的最小权值.
h[i][j][0]:一个端点是j.另一个端点在点集i中的边的最小权值.
h[i][j][1]:一个端点是j.另一个端点在点集i中的边的次小权值....