当前位置: 首页 > news >正文

算法复习之前缀和【备战蓝桥杯】

一维前缀和

S[i] = a[1] + a[2] + ... a[i]
a[l] + ... + a[r] = S[r] - S[l - 1]

二维前缀和

S[i, j] = 第i行j列格子左上部分所有元素的和
以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:
S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1 - 1, y1 - 1]

练习题

562. 壁画

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 5e6 + 10;
int n;
int s[N];
char str[N];int main()
{int T;scanf("%d", &T);for (int x = 1; x <= T; x ++ ){scanf("%d", &n);scanf("%s", str + 1);memset(s, 0, sizeof s);for (int i = 1; i <= n; i ++ ) s[i] += s[i - 1] + str[i] - '0';int k = (n - 1) / 2 + 1;int sum = 0;for (int i = k; i <= n; i ++ )sum = max(sum, s[i] - s[i - k]);printf("Case #%d: %d\n", x, sum);}return 0;
}

795. 前缀和

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 1e5 + 10;
int n, m;
int s[N];int main()
{scanf("%d%d", &n, &m);for (int i = 1; i <= n; i ++ ) {scanf("%d", &s[i]);s[i] += s[i - 1];}while (m -- ) {int l, r;scanf("%d%d", &l, &r);printf("%d\n", s[r] - s[l - 1]);}return 0;
}

796. 子矩阵的和

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;int n, m, q;
const int N = 1010;
int s[N][N];int main()
{scanf("%d%d%d", &n, &m, &q);for (int i = 1; i <= n; i ++ ) for (int j = 1; j <= m; j ++ ) scanf("%d", &s[i][j]);for (int i = 1; i <= n; i ++ ) for (int j = 1; j <= m; j ++ ) s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];while(q -- ){int x1, y1, x2, y2;cin >> x1 >> y1 >> x2 >> y2;printf("%d\n", s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]);}return 0;
}

1230. K倍区间

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;typedef long long LL;
const int N = 100010;int n, k;
LL s[N], cnt[N];int main()
{scanf("%d%d", &n, &k);for (int i = 1; i <= n; i ++ ) {scanf("%d", &s[i]);s[i] += s[i - 1];}// for (int i = 1; i <= n; i ++ ) printf("%d ", s[i]);LL res = 0;cnt[0] ++;for (int i = 1; i <= n; i ++ ) {res += (LL)cnt[s[i] % k];cnt[s[i] % k] ++;}printf("%lld\n", res);return 0;
}

4405. 统计子矩阵

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;typedef long long LL;
const int N = 510;
int n, m, k;
int s[N][N];int main()
{scanf("%d%d%d", &n, &m, &k);for (int i = 1; i <= n; i ++ ) for (int j = 1; j <= m; j ++ ) {scanf("%d", &s[i][j]);s[i][j] += s[i - 1][j];}LL res = 0;      // 枚举上下边界for (int i = 1; i <= n; i ++ ) for (int j = i; j <= n; j ++ )// 双指针降低一层循环来枚举左右边界for (int l = 1, r = 1, sum = 0; r <= m; r ++ ) {sum += s[j][r] - s[i - 1][r];while (sum > k) {sum -= s[j][l] - s[i - 1][l];l ++;}res += r - l + 1;}printf("%lld\n", res);return 0;
}
http://www.lryc.cn/news/309912.html

相关文章:

  • IDEA基础——Maven配置tomcat
  • 数据结构测试题
  • 【MATLAB】兔子机器人总系统_动力学模型解读(及simulink中的simscape的各模块介绍)
  • Launch学习
  • 蓝桥OJ 2942数字王国之军训排队 DFS剪枝
  • SSL证书
  • 【C++】string 类 ( 上)
  • 《中华人民共和国消防法》(2021年修订版)解读
  • vue+element模仿实现云码自动验证码识别平台官网
  • 蓝桥杯练习系统(算法训练)ALGO-992 士兵杀敌(二)
  • Pycharm下如何生成exe软件
  • KubeSphere平台安装系列之三【Linux多节点部署KubeSphere】(3/3)
  • YOLOv9独家改进|动态蛇形卷积Dynamic Snake Convolution与空间和通道重建卷积SCConv与RepNCSPELAN4融合
  • XSS初级漏洞靶场
  • k8s pv与pvc理解与实践
  • Unity游戏输入系统(新版+旧版)
  • 区块链媒体:链游媒体宣发渠道9个方法分享-华媒舍
  • LeetCode--42
  • 【解决】虚幻导入FBX模型不是一个整体
  • 第四十八回 解珍解宝双越狱 孙立孙新大劫牢-Python模块和包概念与使用
  • 【Spring连载】使用Spring Data访问 MongoDB----对象映射之属性转换器
  • 【axiox】前后端接口通讯数据交互
  • 《Linux C编程实战》笔记:共享内存
  • 【GitHub】修改默认分支
  • 常用Linux 命令汇总
  • 13 双口 RAM IP 核
  • 【高级数据结构】Trie树
  • 国际化 Vue-i18n的安装与使用 (Vue2.0 / Vue3.0)
  • Linux 学习笔记(8)
  • 【python】1.python3.12.2和pycharm社区版的安装指南