二維前綴和+差分 HDU6514 Monitor

Monitor

[ HDU - 6514 ]

題目大意:給你個n×m的區域,每個區域被選中標記爲1,沒被選中標記爲0,然後給一些標記的區域,查詢若干個區域問是否有0的

一道二維前綴和的題目,想通沒什麼難度

代碼如下

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

const int maxn = 1e7 + 10;

int n, m, p, q;
int a[maxn];

int getid(int i, int j)
{
    if (i == 0 || j == 0 || i > n || j > m)
        return 0;
    return (i - 1) * m + j;
}

void add(int i, int j, int v)
{
    int id = getid(i, j);
    if (!id)
        return;
    a[id] += v;
}

int main(void)
{
    IO;
    while (~scanf("%d%d", &n, &m)) {
        memset(a, 0, sizeof(a));
        int x1, y1, x2, y2;
        scanf("%d", &p);
        for (int i = 0; i < p; i++) {
            scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
            add(x1, y1, 1);
            add(x2 + 1, y2 + 1, 1);
            add(x1, y2 + 1, -1);
            add(x2 + 1, y1, -1);
        }

        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
                a[getid(i, j)] += a[getid(i - 1, j)] + a[getid(i, j - 1)] - a[getid(i - 1, j - 1)];

        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
                if (a[getid(i,j)] > 0)
                    a[getid(i, j)] = 1;

        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
                a[getid(i, j)] += a[getid(i - 1, j)] + a[getid(i, j - 1)] - a[getid(i - 1, j - 1)];

        scanf("%d", &q);
        for (int i = 0; i < q; i++) {
            scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
            int ans = a[getid(x2, y2)] - a[getid(x1 - 1, y2)] - a[getid(x2, y1 - 1)] + a[getid(x1 - 1, y1 - 1)];
            if (ans == (x2 - x1 + 1) * (y2 - y1 + 1))
                puts("YES");
            else
                puts("NO");
        }
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章