由于l、r的取值范围较大,首先需要进行离散化处理 1、离散化 structnode{intl, r; string type; } a[N];ints[N *2], cnt;//用于离散化的数组map<int,int> h;//用于离散化的map//离散化intidx =0;sort(s +1, s + cnt +1);for(inti =1; i <= cnt; i++) {if(!h.count(s[i])) h...
二位前缀和目的是预处理出一个结构,以后每次查询二维数组任何范围上的累加和都是 O(1) 的操作根据原始状况,生成二维前缀和数组sum, sum[i][j]: 代表左上角 (0,0) 到右下角 (i,j) 这个范围的累加和 sum[i][j] += sum[i][j - 1] + sum[i - 1][j] - sum[i - 1][j - 1]; 查询左...
但是如果确定了length可以枚举左上端点,计算出右下端点,直接计算所需大小的所有矩形,通过前缀和来进行容斥计算 Acwing 99. 激光炸弹 枚举对角端点也可以简化成确定左边界,枚举上下边界和又边界的问题 AcWing 126. 最大的和 离散化离散化思想:不在乎数字原本大小多少,只在乎数字间的相对大小关系(第一大,第二大......
#include<bits/stdc++.h>usingnamespacestd;constintN =5005;inta[N], b[N];intn, ansk, ansm = INT_MAX;intmain(){ cin >> n;charc;for(inti =1; i <= n; i++) { cin >> c;if(c =='F') a[i] =1;elseif(c =='B') a[i] =0; }for(intk =1; k <= n; k++) {memc...
直观上来看,此题是一个差分应用,针对二维差分数组,将n个矩形区域内每个格子的值加1,然后统计有多少个不为0的格子即可。 但是!坐标值取值范围是−10^8≤x1,y1,x2,y2≤10^8,定义二维数组会爆内存,枚举时间也无法保证。因此,需要将坐标值进行离散化!
第一步:计算差分数组 第二步:针对差分数组进行区间加数操作 第三步:重新计算前缀和数组,统计最小值 100分代码: #include<bits/stdc++.h>usingnamespacestd;constintN =5000006;intn, p;ints[N], a[N];intmain(){scanf("%d%d", &n, &p);for(inti =1; i <= n; i++) ...
因此,问题转化为:给定一个差分数组a[],每次对两个数a[l],a[r+1]分别进行+1、-1操作(对于前缀和数组就是对[l,r]每个数都+1或-1),最终使得除a[1]之外都变成0,而a[1]的数值决定其前缀和数组有多少种不同的序列。 一共有如下几种可能的操作: ...
洛谷题单指南-前缀和差分与离散化-P1904 天际线 原题链接:https://www.luogu.com.cn/problem/P1904 题意解读:给出(左端点,高度,右端点)表示的若干建筑,要输出其轮廓,所谓轮廓就是每个点被覆盖的最高建筑的高度所描绘的线。 解题思路: 如果能计算每个点被覆盖的最高建筑的高度,用数组h[10005]保存,那么输出...
题意解读:对于数组a[N],给定m个区间l~r,求每个区间所有元素之和。 解题思路: 先思考暴力做法: 对于每一个区间[l, r],累加a[l] ~ a[r]所有元素,时间复杂度最坏为10^5 * 10^4,不可行。 一维前缀和: 设s[N]是a[N]的前缀和数组,即对于每一个s[i],都表示s[i] = a[1] + ... + a[i]...
设t[i] = x表示离散化之后,第i个坐标位置是x类型的牛 这样一来,问题简化成:在t[]中,找到一个区间,使得区间内包括cnt2种不同数字,并且区间端点l,r在离散化之前的差值最小, 通过双指针+哈希数组即可解决。 100分代码: #include<bits/stdc++.h>usingnamespacestd;constintN =50005;intx[N], id[N], ...