题解:SP30692 ADARAINB - Ada and Rain II

· · 题解

题目大意

记录 n 次下雨,每次下雨都是一个 (x1, y1)(x2, y2) 的矩阵,查询 m 次,每次查询一个点 (x, y) 输出该点的下雨次数。

思路

既然是填充某个矩阵, 第一种方法便是输入一个, 就填充。但是如果是这种方法的话,很明显, 数据是不支持这样做的。

这时我们就可以用差分 + 前缀和的思路做。接下来我将介绍差分和前缀和, 学过的同学可以跳过。

:::info[差分和前缀和]

学习视频

:::

:::success[code]

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;

int n, m, l, mp[10005][10005];

int main(){
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

    cin >> n >> m >> l;
    int sx, sy, ex, ey;
    for(int i = 1;i <= n;i++){
        cin >> sx >> sy >> ex >> ey;
        mp[sx][sy] += 1;
        mp[ex][sy + 1] -= 1;
        mp[ex + 1][sy] -= 1;
        mp[ex + 1][ey + 1] += 1;
    }

    for(int i = 1;i <= l;i++){
        for(int j = 1;j <= l;j++){
            mp[i][j] = mp[i - 1][j] + mp[j - 1] - mp[i - 1][j - 1] + mp[i][j];
        }
    }

    int x, y;
    while(m--){
        cin >> x >> y;
        cout << mp[x][y];
    }

    return 0;
}

:::