随笔分类 - 树状数组
摘要:Find String in a Grid 把矩阵按行接起来求一个SA, 把矩阵按列接起来求一个SA, 然后就枚举询问串的转折点, 转换成求矩阵内二维数点的个数。
阅读全文
摘要:HDU - 5741 我们枚举段的起点和终点, 那么每一种情况0的范围是[lx, rx], 1的出现范围是[ly, ry], 可以在二维平面上用矩形表示。 然后问题就变成了询问点有没有被至少一个矩形覆盖, 扫描线 + 树状数组就可以了。
阅读全文
摘要:HDU - 5788 我们考虑把每个点遍历一遍, 把枚举的当前的这个点改成100000对答案的影响。 如果我们把 u 变成 100000, 受到影响的是 u 以及它的祖先, 我们记midu为子树u的中位数, nexmidu为子树u中位数的下一个数。 只有 a[ u ]的值小于等于祖先的mid, 才会
阅读全文
摘要:HDU - 5372 我们考虑总的线段减去违法的线段, 因为是按长度从小到大加入数轴的, 所以违法线段就是Rj > Ri的个数加上 Lj < Li 的个数, 用树状数组维护就完事了。
阅读全文
摘要:HDU - 5406 排序之后就变成了求两个不相交的最长LIS, 用树状数组把n ^ 3 的dp 优化成 n ^ 2 * log(n) 就ok 了。
阅读全文
摘要:想出来感觉挺容易, 码得好麻烦啊。。。 把每个点分为轻点和重点, 给轻点的信息直接修改, 重点建个字典树去维护。
阅读全文
摘要:NN country 是1175E的加强树上版本, 大致思路是一样的。。 难点在于判断两个点是否被同一条线覆盖。。 居然没想出来。 我们先把所有点对都离线,对于点对(u, v) 我们dfs到 u 的时候 记录一下v子树的和为 t1, 然后把所有在 u 的线段的另一端 + 1, 向子树递归, 回溯的时
阅读全文
摘要:点分治之后用树状数组维护个数。
阅读全文
摘要:Beautiful Matrix 首先枚举哪一位分出大小, 然后计算比它小的方案数有多少种。 方案数 = 当前行的方案数 * 下面所有行的方案数。 如果下面还有x行, 那么下面所有行的方案数为 g ^ x, g 为全错排的方案数, 当前行的要预处理出f[ i ][ j ] f[ i ][ j ] 表
阅读全文
摘要:Scalar Queries 昨天没打好像亏疯了, 好像都是sb题啊。 我们先考虑单个区间[L, R], 对于[L, R]中的一个数 x , 我们只需要只要有多少个数字排序之后排到它前面去了就好。 那么整体来说对于 x , 只有比 x 小的数字对 x 有贡献, 我们只要计算出所有比它小的数字, 在所
阅读全文
摘要:Inversions After Shuffle 如果改变的是[L, R], 那么[L, R]内的逆序对数的期望为 len * (len - 1) / 2 所以我们的目标变成了, 求出所有区间内的逆序对之和, 这个用树状数组就能维护了。
阅读全文
摘要:Putting Boxes Together 二分找到分界点, 左边的往右移, 右边的往左移。 其实把a[ i ] - i 之后就变成了移到一个点, 然后我维护移到一个线段都要维护自闭了。
阅读全文
摘要:Recursive Queries 刚开始把最大位置看成最大值, 我想这怎么写啊。。。 如果是最大位置的话, 我们能计算区间内每个值作为最大值的贡献, 然后拆成右边边第一个比它大的下标减去左边第一个比它大的下标, 然后离线之后就可以树状数组维护了。
阅读全文
摘要:Garlands 我怎么感觉好水啊。 因为询问只有2000组, 离线询问, 枚举联通块再枚举询问, 二维树状数组更新答案。
阅读全文
摘要:思路:随便猜一猜填的数字是不下降的,反证很好证明,然后就没了。。
阅读全文
摘要:题目大意:给你n个点, n个点的坐标都在200以内,让你统计不相交的两个L形的种数,且L形的两条边长的gcd = 1。 思路:用二维树状数组维护点的信息,然后划分区块进行统计,题解是用总的减去相交的,不需要用到二维树状数组。
阅读全文
摘要:E2 - Median on Segments (General Case Edition) 题目大意:给你一个数组,求以m为中位数的区间个数。 思路:很巧秒的转换,我们把<= m 数记为1, >m的数 记为-1, 求其前缀, 我们将问题转变成求以<= m 的数作为中位数的区间个数, 答案就变为an
阅读全文
摘要:#include #define LL long long #define fi first #define se second #define mk make_pair #define pii pair using namespace std; const int N = 300 + 7; const int M = 2e5 + 7; const int inf = 0x3f3f3f3...
阅读全文
摘要:思路:我们考虑dp[ i ] 表示的是 i 在指定位置上 的最大个数, dp[ i ] = max(dp[ j ] + 1) j需要满足3个条件 1. j < i 2. a[ j ] < a[ i ] 3. a[ i ] - a[ j ] <= i - j 通过 2,3 我们能推出1 所以其实是个二
阅读全文