摘要:
考虑我们需要维护的是这样一个东西。 即可能变化的只有每一行前$m - 1$个,和最后一列。 我们考虑对每一行开一个权值线段树,记录原本序列的第$x$个是否被一出,且用一个$vector$记录多出的部分。 那么很好维护的。 考虑内存的问题,我们用动态开点就行了。 #include<iostream> 阅读全文
摘要:
嗯,这玩意可能也叫动态$dp$,反正我是不太觉得这个名字有多好。 维护矩阵连乘以应对动态规划修改问题的一些流程。 1.写出转移矩阵 2.利用数据结构维护一个区间矩阵乘积 3.思考,修改单点会对整个矩阵乘积或者数据结构产生的影响。 嗯,大概就是这样。 接下来讲个例题。 【模板】"动态 DP"&动态树分 阅读全文
摘要:
是一个很经典集合问题。 在一个点集中,一定可以分割成若干个联通子集。 如果我们设 \(f_i\) 为一个点集的联通方案,\(g_i\) 为一个点集的所有方案。 我们先任取一个点,考虑枚举一个集合和这个点不联通。 那么我们知道这样不连通的方案 \(\sum g[j] \times\ f[i\ xor\ 阅读全文
摘要:
考虑到如果只有一个矩形的话我们可以很方便的求出答案。 那么我们可以通过对序列进行建笛卡尔树来做到划分矩形。 注意在dp时,子矩阵的合并类似于背包。 考虑父节点时考虑已经选过的列。 #include<bits/stdc++.h> using namespace std; typedef long lo 阅读全文
摘要:
考虑二分答案。 肯定是对每个节点的儿子都要染色。 当时以为是所有节点的儿子数量的最多的。 后来发现前面如果有多余可以多给后面的。 设$f[i]$为$i$节点及子树的和标准操作的差。 那么$f[i] = \sum_{(i \to v)}\ max(0,f[v]) + son[i] - k$ 考虑$f[ 阅读全文