1. 程式人生 > >JoyOI1026 犁田機器人

JoyOI1026 犁田機器人

題目限制

時間限制 記憶體限制 評測方式 題目來源
1000ms 131072KiB 標準比較器 Local

題目背景

USACO OCT 09 2ND

題目描述

Farmer John為了讓自己從無窮無盡的犁田工作中解放出來,於是買了個新機器人幫助他犁田。這個機器人可以完成犁田的任務,可惜有一個小小的缺點:這個犁田機器人一次只能犁一個邊的長度是整數的長方形的田地。

因為FJ的田地有樹和其他障礙物,所以FJ設定機器人去犁很多不同的長方形。這些長方形允許重疊。他給機器人下了P個指令,每個指令包含一個要犁長方形的地。這片田地由長方形的左下角和右上角座標決定。他很好奇最後到底有多少個方格的地被犁過了。

一般來說,田地被分割為很多小方格。這些方格的邊和x軸或y軸平行。田地的寬度為X個方格,高度為Y個方格 (1 <= X <= 240; 1 <= Y <= 240). FJ執行了I (1 <= I <= 200)個指令,每個指令包含4個整數:Xll, Yll, Xur, Yur (1 <= Xll <=Xur; Xll <= Xur <=X; 1 <= Yll <= Yur; Yll <= Yur <= Y), 分別是要犁的長方形的左下角座標和右上角座標。機器人會犁所有的橫座標在Xll..Xur並且縱座標Yll..Yur範圍內的所有方格的地。可能這個長方形會比你想像的多一行一列(就是說從第Xll列到第Xur列一共有Xur - Xll + 1列而不是Xur - Xll列)。

考慮一個6方格寬4方格高的田地。FJ進行了2個操作(如下),田地就被成""和"#"了。雖然一般被犁過的地看起來都是一樣的。但是標成"#"可以更清晰地看出最近一次被犁的長方形。

     ......             ....             #####.
    ......  (1,1)(2,4) 

....  (1,3)(5,4) #####.
    ......             ....             ....
    ......             *....             
....

一共14個方格的地被犁過了。

輸入格式

 第一行: 三個由空格隔開的整數: X, Y, I

 第二行到第I+1行:第i+1行有四個整數Xll, Yll, Xur, Yur,表示第i個指令。

輸出格式

第一行: 一個單獨的整數表示被犁過的方格數。

樣例資料

輸入樣例 #1 輸出樣例 #1
6 4 2
1 1 2 4
1 3 5 4
14

由於地圖小指令少,所以模擬即可

每次把要犁的地for一遍,打上標記,最後統計標記數量

複雜度O(XYL)

牛人程式碼:

#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 1000000000
#define ll long long
using namespace std;
int X,Y,L,ans;
bool mark[255][255];
int main()
{
    scanf("%d%d%d",&X,&Y,&L);
    for(int i=1;i<=L;i++)
    {
        int x_1,y_1,x_2,y_2;
        scanf("%d%d%d%d",&x_1,&y_1,&x_2,&y_2);
        for(int j=x_1;j<=x_2;j++)
            for(int k=y_1;k<=y_2;k++)
                if(!mark[j][k])
                {
                    ans++;
                    mark[j][k]=1;
                }
    }
    printf("%d\n",ans);
    return 0;
}