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)
...... .... ....
...... *.... ....
一共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; }