基準時間限制:1.5 秒 空間限制:131072 kb 分值: 20 難度:3級演算法題
現在有一塊玻璃,是長方形的(w 公釐× h 公釐),現在要對他進行切割。
切割的方向有兩種,橫向和縱向。每一次切割之後就會有若干塊玻璃被分成兩塊更小的玻璃。在切割之後玻璃不會被移動。
現在想知道每次切割之後面積最大的一塊玻璃是多少。
樣例解釋:
對於第四次切割,下面四塊玻璃的面積是一樣大的。都是2。
input
單組測試資料。output第一行有三個整數 w,h,n (2≤w,h≤200000, 1≤n≤200000),表示玻璃在橫向上長w 公釐,縱向上長h 公釐,接下來有n次的切割。
接下來有n行輸入,每一行描述一次切割。
輸入的格式是h y 或 v x。
h y表示橫向切割,切割線距離下邊緣y公釐(1≤y≤h-1)。
v x表示縱向切割,切割線距離左邊緣x公釐(1≤x≤w-1)。
輸入保證不會有兩次切割是一樣的。
對於每一次切割,輸出所有玻璃中面積最大的是多少。input示例
樣例輸入1output示例4 3 4
h 2v 2
v 3v 1
樣例輸出184對於每一行,記錄它上一行和下一行的位置,以及它距離上一行的長度,列同理42
由於所有的線都是直線,所以最大面積=最大行間距*最大列間距
為了減小複雜度,離線做,把最終的形態先弄出來,找到最大值,然後按相反的順序刪邊,容易知道,如果刪邊會產生更大的玻璃,這塊玻璃一定以刪去的邊為邊,於是直接更新不需要其他操作。
最後別忘了用long long
#include#includeusing
namespace
std;
#define maxn 200010
long
long
w,h,n,ans[maxn];
bool
x[maxn],y[maxn];
struct
nodeop[maxn];
struct
nodehang[maxn],lie[maxn];
intmain()
ans[
0]=w*h;
long
long dx=0,dy=0
;
for(long
long i=0,p=0;i<=w;i++)
lie[w].nxt=w;
for(long
long i=0,p=0;i<=h;i++)
hang[h].nxt=h;
ans[n]=dx*dy;
for(long
long i=n;i>=2;i--)
else
ans[i-1]=dx*dy;
}for(long
long i=1;i<=n;i++)
}
51nod 1562 玻璃切割
現在有一塊玻璃,是長方形的 w 公釐 h 公釐 現在要對他進行切割。切割的方向有兩種,橫向和縱向。每一次切割之後就會有若干塊玻璃被分成兩塊更小的玻璃。在切割之後玻璃不會被移動。現在想知道每次切割之後面積最大的一塊玻璃是多少。樣例解釋 對於第四次切割,下面四塊玻璃的面積是一樣大的。都是2。input ...
51nod 1562 玻璃切割
1562 玻璃切割 codeforces 基準時間限制 1.5 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 現在有一塊玻璃,是長方形的 w 公釐 h 公釐 現在要對他進行切割。切割的方向有兩種,橫向和縱向。每一次切割之後就會有若干塊玻璃被分成兩塊更小的玻璃。在切割之後玻璃不會被...
51nod 貪心入門
有若干個活動,第i個開始時間和結束時間是 si,fi 活動之間不能交疊,要把活動都安排完,至少需要幾個教室?分析 能否按照之一問題的解法,每個教室安排盡可能多的活動,即按結束時間排序,再貪心選擇不衝突的活動,安排乙個教室之後,剩餘的活動再分配乙個教室,繼續貪心選擇 反例 a 1,2 b 1,4 c ...