一、Y总视频进度
二、刷题
2.1 干草堆
1. 问题描述
2. 问题分析
做题思路:
- 如果a[n]数组全部是0,那么其差分数组b[n]也全部是0;如果a[n]数组不是全部为0,则进行第二步操作;
- 构造差分数组b[n],进行n次: b[i] += c; b[i+1] -= c; (i 属于 1-n)操作;
3. 问题解决
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6 + 10;
int b[N];
int main()
{
int n, m;
scanf("%d%d", &n, &m);
while (m -- )
{
int l, r;
scanf("%d%d", &l, &r);
b[l] += 1;
b[r+1] -= 1;
}
for (int i = 1; i <= n; i ++ ) b[i] += b[i-1];
nth_element(b+1, b+(n+1)/2, b+n+1);
printf("%d\n", b[n+1 >> 1]);
return 0;
}
2.2 AcWing-796:子矩阵的和
1. 问题描述
2. 问题分析
3. 问题解决
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10010;
int s[N][N];
int main()
{
int n, m, q;
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]);
// 初始化前缀和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;
scanf("%d%d%d%d", &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;
}