cf1200 D White Lines(二维差分)】的更多相关文章

题目背景 此题约为NOIP提高组Day2T1难度. 题目描述 在n*n的格子上有m个地毯. 给出这些地毯的信息,问每个点被多少个地毯覆盖. 输入输出格式 输入格式: 第一行,两个正整数n.m.意义如题所述. 接下来m行,每行两个坐标(x1,y1)和(x2,y2),代表一块地毯,左上角是(x1,y1),右下角是(x2,y2). 输出格式: 输出n行,每行n个正整数. 第i行第j列的正整数表示(i,j)这个格子被多少个地毯覆盖. 输入输出样例 输入样例#1: 5 3 2 2 3 3 3 3 5 5…
题意 给定一个\(n×m\)的矩阵.(\(n×m <= 1e7\)). \(p\)次操作,每次可以在这个矩阵中覆盖一个矩形. \(q\)次询问,每次问一个矩形区域中,是否所有的点都被覆盖. 解析 修改的时候用二维差分,判断的时候用二维前缀和. 增加矩形\((x1, y1),(x2, y2)\)时: dis[id(x1, y1)]++; dis[id(x1, y2+1)]--; dis[id(x2+1, y1)]--; dis[id(x2+1, y2+1)]++; 求矩形\((x1,y1),(x2…
题目:luogu 2086 二维线段树,按套路差分原矩阵,gcd( x1, x2, ……, xn ) = gcd( xi , x2 - x1 , ……, xn - xn-1 ),必须要有一个原数 xi,恰好每次询问都包含一个固定点 ( X , Y ),差分以它为中心就可以保证它是原值.以 e 为中心的二维差分如图. 对于一维序列,修改区间 [ l , r ] 只需修改差分后的 l 和 r + 1 两点.那么对于二维,差分后的修改如下所示: 中间的灰色格子为守卫者所在地(为方便表示多个区域把它拆成…
 题意是需要求最大的扩散时间,最后输出的是一开始的火源点,那么我们比较容易想到的是二分找最大值,但是我们在这满足这样的点的时候可以发现,在当前扩散时间k下,以这个点为中心的(2k+1)2的正方形块内必须全部都是'X'才行,那么要访问这样的块内的'X'个数显然需要使用二维前缀和维护一下就可以O(1)求出个数,那么这部分问题我们解决,接下来就是二分的如何Check,那么既然我们之前找到了这样满足当期扩散时间的点后,我们只需要直接将这块矩形内部的点全部打标记,显然我们可以得知,如果当前扩散时间是满足要…
Monitor HDU 6514 二维差分入门学习 题意 小腾有\(n*m\)的田地,但是有小偷来偷东西,在一片矩形区域上,有一部分区域是监控可以覆盖到的,这部分区域由一个或多个包含于该矩形区域的小矩形构成:现在给你另一个包含在该矩形区域的小矩形A,问你这个小矩形能否被监控完全覆盖. 解题思路 这个题可以模拟做,就是开一个二维数组,把能监控的区域标记为1,否者就是0,然后在给的小矩形内看看这里面1的个数已不是等于小矩形的面积,是的话就是YES,否者就是NO.但是这个方法会超时.我就无能为力了,这…
题意:有一个二维平面,以及n个操作,每个操作会选择一个矩形,使得这个二维平面的一部分被覆盖.现在你可以取消其中的2个操作,问最少有多少块地方会被覆盖? 思路:官方题解简洁明了,就不细说了:https://codeforces.com/blog/entry/63729. 此处重点记录一下两种做法的巧妙之处. 1:二维差分+解方程 二维差分:假设在矩形[(x1, y1), (x2, y2)]上加一个数,那么在(x1, y1), (x2 + 1, y2 + 1)加1, (x1, y2 + 1), (x…
题意: 在n*n的矩阵中,你可以选择一个k*k的子矩阵,然后将这个子矩阵中的所有B全部变为W,问你怎么选择这个子矩阵使得最终的矩阵中某一行全是W或者某一列全是W的个数最多 题解:考虑每一行和每一列,对于特定的一行来说,要想让其全变为W,那么子矩阵的左上角端点是在一个范围中的,因此我们可以把范围中的每一个值加1 为了速度选择用二维差分来做,最终矩阵中的最大值就是答案 此题可以作为二维差分模板 #include<bits/stdc++.h> #define forn(i, n) for (int…
题意:给一个\(nXm\)的矩阵,可以选取\(aXb\)的子矩阵,使子矩阵中的所有元素减一,问最后是否能使矩阵中所有元素变为\(0\). 题解:首先贪心,我们看最左上角的元素,如果\(g[1][1]\ge0\),那么我们就要对其子矩阵的所有元素减去\(g[1][1]\),然后因为\(g[1][1]\)已经是\(0\)了,假如\(g[1][2]\)存在的话,我们就只能让它成为子矩阵的左上角然后再对所有子矩阵减去\(g[1][2]\),以此类推,但是直接暴力的话复杂度会炸,我们需要用数据结构来维护,…
首先我们需要特判只涂了一种颜色的情况: (1)k=1,此时答案就是1:(2)k>1,涂的这种颜色肯定不能是第一个,答案是k-1; 对于其他正常情况,我们对于每个颜色找到一个最小的矩形(这个矩形内包含这种颜色出现的所有位置),用二维差分处理(sum数组),最后统计.如果某位置sum>1,说明这个位置被涂了不止一次,这种颜色就不可能是第一个涂的,打标记.最后统计没有打标记的颜色数量就是答案. 1 #include<bits/stdc++.h> 2 #define int long lo…
题目大意 有一个大小为n的矩阵,每个1*1的单位为黑或白,我们可以用一个(只有一个)大小为k*k的白色矩阵覆盖,问:最多的时候有几条白线(横的全为白 或竖的全为白 即为白线). 思路 要想把一条线(以横的为例)全变为白的,那么我们就需要从这一行最左边的黑色块覆盖到最右边的黑色块,如果两端距离超过k,则无法覆盖,否则就一定可以.那么就一定会产生一个矩阵,选取这个矩阵里面的任何一个点 都可以将这行变为白线:反之,矩阵外的一定不行.所以,可以用差分数组,因为只要选了矩阵里的点,答案就一定就加一.然后二…