1. 程式人生 > >【題解】覆蓋

【題解】覆蓋

ron 技術分享 輸入輸出 spl bsp 3.1 說明 pre 程序

題目描述

楠楠的學校有B個男生和G個女生都來到一個巨大的操場上,操場可以看成是N行M列的方格矩陣,如下圖(1)是一個4行5列的方格矩陣。每個男生負責打掃一些連續的行,每個女生負責打掃一些連續的列。比如有兩個男生,第一個男生負責第1、2兩行、第二個男生負責第4行,如圖(2)的藍色。打掃的區域可能重復,比如,又有兩個女生,第一個女生負責打掃第3、4兩列,第二個女生負責打掃第4、5兩列,如圖(3)的紅色。從圖(3)可以容易看出,有顏色覆蓋的方格數為18,即這4名學生總共打掃了18個方格。

老師要楠楠在學校給出打掃安排的數據後快速計算出這些學生總共打掃了多少方格?

技術分享圖片

輸入輸出格式

輸入格式

第一行,4個正整數:N,M,B,G,N表示方陣行數,M表示方陣列數,B表示男生數,G表示女生數。

接下來B行,每行兩個整數x,y。表示相應某個男生負責打掃從第x行到第y行(共y-x+1行),保證1≤x≤y≤N。

再接下來G 行,每行兩個整數x,y。表示相應某個女生負責打掃從第x列到第y列(共y-x+1 列),保證1≤x≤y≤M。

輸出格式

一行,一個整數,表示所打掃的面積。

輸入輸出樣例

輸入樣例

4 5 2 2

1 2

4 4

3 4

4 5

輸出樣例

18

說明

數據規模

8個的數據:N,M,B,G的範圍都是[1...100]。

剩下2個的數據:N,M,B,G的範圍都是[1...5000]。

題解

直接求貌似會,我們可以換一個思路,求沒覆蓋到的面積,用差分優化可以更快。

技術分享圖片
#include <cstdio>

int n, m, b, g;
int r[5001], c[5001];
int tmpn, tmpm;

int main()
{
    scanf("%d%d%d%d"
, &n, &m, &b, &g); int lt, rt; for(register int i = 1; i <= b; ++i) { scanf("%d%d", &lt, &rt); ++r[lt]; --r[rt + 1]; } for(register int i = 1; i <= g; ++i) { scanf("%d%d", &lt, &rt); ++c[lt]; --c[rt + 1]; } for(register int i = 1; i <= n; ++i) { r[i] += r[i - 1]; if(!r[i]) ++tmpn; } for(register int i = 1; i <= m; ++i) { c[i] += c[i - 1]; if(!c[i]) ++tmpm; } printf("%d", n * m - tmpn * tmpm); return 0; }
參考程序

【題解】覆蓋