0
点赞
收藏
分享

微信扫一扫

2022-01-04每日刷题打卡

witmy 2022-01-04 阅读 51
算法

一、Y总视频进度

img

二、刷题

2.1 干草堆

1. 问题描述

img

2. 问题分析

img

做题思路:

  • 如果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. 问题描述

img

2. 问题分析

img

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;
}
举报

相关推荐

0 条评论