前缀数组的介绍和使用

我们先来实现一个二维数组的前缀:

int main()

{

int n, m, q;

cin>>n >>m >> q;

vector<vector<int>> arr(n + 1, vector<int>(m + 1));

for (int i = 1; i <= n; i++) {

for (int j = 1; j <= m; j++) {

cin >> arr[i][j];

}

}

vector<vector<long long>> dp(n + 1, vector<long long>(m + 1));

for (int i = 1; i <= n; i++) {

for (int j = 1; j <= m; j++) {

dp[i][j] = dp[i - 1][j] + dp[i][j - 1] + arr[i][j] - dp[i - 1][j - 1];

int x1 = 0, y1 = 0, x2 = 0, y2 = 0;

while (q > 0) {

q--;

cin >> x1 >> y1 >> x2 >> y2;

cout << dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1] << endl;

}

}

}

return 0;

}

class Solution {

public:

vector<int> productExceptSelf(vector<int>& nums) {

int n=nums.size();

vector<int> f(n),g(n);

f[0]=1;

g[n-1]=1;

for(int i=1;i<n;i++){

f[i]=f[i-1]*nums[i-1];

}

for(int i=n-2;i>=0;i--){

g[i]=g[i+1]*nums[i+1];

}

vector<int> ret(n);

for(int i=0;i<n;i++){

ret[i]=f[i]*g[i];

}

return ret;

}

};

class Solution {

public:

int subarraySum(vector<int>& nums, int k) {

unordered_map<int,int> hash;

hash[0]=1;

int sum=0,ret=0;

for(auto e:nums){

sum+=e;

if(hash.count(sum-k)) ret+=hash[sum-k];

hash[sum]++;

}

return ret;

}

};

class Solution {

public:

int pivotIndex(vector<int>& nums) {

int n=nums.size();

vector<int> f(n),g(n);

for(int i=1;i<n;i++){

f[i]=f[i-1]+nums[i-1];

}

for(int j=n-2;j>=0;j--){

g[j]=g[j+1]+nums[j+1];

}

for(int i=0;i<n;i++){

if(f[i]==g[i]){

return i;

}

}

return -1;

}

};

class Solution {

public:

int findMaxLength(vector<int>& nums) {

int n=nums.size();

unordered_map<int,int> hash;

hash[0]=-1;

int sum=0,ret=0;

for(int i=0;i<n;i++){

sum+=nums[i]==0?-1:1;

if(hash.count(sum)) ret=max(ret,i-hash[sum]);

else hash[sum]=i;

}

return ret;

}

};

class Solution {

public:

vector<vector<int>> matrixBlockSum(vector<vector<int>>& mat, int k) {

int m=mat.size(),n=mat[0].size();

vector<vector<int>> dp(m+1,vector<int>(n+1));

for(int i=1;i<=m;i++){

for(int j=1;j<=n;j++){

dp[i][j]=dp[i-1][j]+dp[i][j-1]+mat[i-1][j-1]-dp[i-1][j-1];

}

}

vector<vector<int>> ret(m,vector<int>(n));

for(int i=0;i<m;i++){

for(int j=0;j<n;j++){

int x1=max(0,i-k)+1,y1=max(0,j-k)+1;

int x2=min(m-1,i+k)+1,y2=min(n-1,j+k)+1;

ret[i][j]=dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1];

}

}

return ret;

}

};

相关推荐
ComputerInBook20 分钟前
C++ 14 相比 C++ 11新增之特征
开发语言·c++·c++ 14
Aaron158825 分钟前
全频段 SDR干扰源模块解决方案(星链干扰、LORA无人机干扰)
人工智能·算法·fpga开发·硬件架构·硬件工程·无人机·信息与通信
AI科技星29 分钟前
全域数学·球面拓扑微扰标准系数η=0.01 应用详解(典籍正式版)
人工智能·算法·数学建模·数据挖掘·机器人
微风欲寻竹影30 分钟前
Java数据结构——栈(Stack)详解
java·开发语言·数据结构
Peter·Pan爱编程35 分钟前
成员函数与 this 指针:函数属于数据
c++
牢姐与蒯40 分钟前
C++数据结构之红黑树
数据结构
逻辑君44 分钟前
物理学研究报告【20260001】
人工智能·算法
YL200404261 小时前
041二叉树的层序遍历
数据结构·leetcode·bfs
AI科技星1 小时前
算法联盟·全域数学公理体系下黑洞标量毛发与LVK引力波O4全维理论、求导、证明、计算、验证、分析
人工智能·线性代数·算法·架构·学习方法·量子计算
谙弆悕博士1 小时前
【附C语言源码】C语言 栈结构 实现及其扩展操作
c语言·开发语言·数据结构·算法·链表·指针·