二位前缀和目的是预处理出一个结构,以后每次查询二维数组任何范围上的累加和都是 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]; 查询左...
#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...
由于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...
所谓离散化,就是用数字的相对值替代他们的绝对值,能够将分布广而稀疏的数字转为连续的、密集的分布,从而起到节省空间的效果。 对于本问题,尽管a,b取值范围较大,但是区间不超过20000个,也就是a,b的值最多40000个,我们可以建立一个1~40000的数值与真实a、b之间的映射关系,如样例:建立一个c[]数组,编号与a,b...
直观上来看,此题是一个差分应用,针对二维差分数组,将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++) ...
然后,根据差分数组还原前缀和数组,即可枚举每段路走的次数,计算买卡和不买卡两种花费,取较小值累加。 100分代码: #include<bits/stdc++.h>usingnamespacestd;constintN =100005;ints[N];//每一段路走了几次intd[N];//s的差分数组intp[N];//路径inta[N], b[N], c[N];intn, m;longlongans;int...
因此,问题转化为:给定一个差分数组a[],每次对两个数a[l],a[r+1]分别进行+1、-1操作(对于前缀和数组就是对[l,r]每个数都+1或-1),最终使得除a[1]之外都变成0,而a[1]的数值决定其前缀和数组有多少种不同的序列。 一共有如下几种可能的操作: ...
设t[i] = x表示离散化之后,第i个坐标位置是x类型的牛 这样一来,问题简化成:在t[]中,找到一个区间,使得区间内包括cnt2种不同数字,并且区间端点l,r在离散化之前的差值最小, 通过双指针+哈希数组即可解决。 100分代码: #include<bits/stdc++.h>usingnamespacestd;constintN =50005;intx[N], id[N], ...
题意解读:对于数组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]...