51nod 1562 玻璃切割

2021-08-12 00:19:10 字數 2091 閱讀 2891

現在有一塊玻璃,是長方形的(w 公釐× h 公釐),現在要對他進行切割。

切割的方向有兩種,橫向和縱向。每一次切割之後就會有若干塊玻璃被分成兩塊更小的玻璃。在切割之後玻璃不會被移動。

現在想知道每次切割之後面積最大的一塊玻璃是多少。

樣例解釋:

對於第四次切割,下面四塊玻璃的面積是一樣大的。都是2。

input

單組測試資料。

第一行有三個整數 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)。

輸入保證不會有兩次切割是一樣的。

output

對於每一次切割,輸出所有玻璃中面積最大的是多少。
input示例

樣例輸入1

4 3 4

h 2v 2

v 3v 1

output示例

樣例輸出184

42

思路:

並查集。可以先簡化問題,比如只在水平方向進行切割,將高度每隔1個單位初始化rank為1,如果該點未被切割,則向下乙個點進行合併,計算新的最大高度。最後將做法擴充套件到垂直方向即可。

#include #include #include using namespace std;

typedef long long int ll;

const int maxn = 2e5 + 10;

int w, h, n;

int input[maxn];

bool isver[maxn];

bool visw[maxn];

bool vish[maxn];

int parentw[maxn];

int parenth[maxn];

int rankw[maxn];

int rankh[maxn];

int maxw;

int maxh;

ll result[maxn];

char dir;

int findh(int x)

return parenth[x];}

void joinh(int x, int y)

parenth[x] = y;

rankh[y] += rankh[x];

maxh = max(maxh, rankh[y]);}

int findw(int x)

return parentw[x];}

void joinw(int x, int y)

parentw[x] = y;

rankw[y] += rankw[x];

maxw = max(maxw, rankw[y]);}

void init()

for (int i = 1; i <= h; i++)

maxw = 1;

maxh = 1;

rankw[0] = 0;

rankh[0] = 0;

memset(visw, false, sizeof(visw));

memset(vish, false, sizeof(vish));}

int main()

else

}for (int i = 1; i < w; i++) }

for (int i = 1; i < h; i++) }

for (int i = n - 1; i >= 0; i--)

else

}for (int i = 0; i < n; i++)

return 0;

}

51nod 1562 玻璃切割

1562 玻璃切割 codeforces 基準時間限制 1.5 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 現在有一塊玻璃,是長方形的 w 公釐 h 公釐 現在要對他進行切割。切割的方向有兩種,橫向和縱向。每一次切割之後就會有若干塊玻璃被分成兩塊更小的玻璃。在切割之後玻璃不會被...

51nod 1562 玻璃切割

基準時間限制 1.5 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 現在有一塊玻璃,是長方形的 w 公釐 h 公釐 現在要對他進行切割。切割的方向有兩種,橫向和縱向。每一次切割之後就會有若干塊玻璃被分成兩塊更小的玻璃。在切割之後玻璃不會被移動。現在想知道每次切割之後面積最大的一塊...

51nod 貪心入門

有若干個活動,第i個開始時間和結束時間是 si,fi 活動之間不能交疊,要把活動都安排完,至少需要幾個教室?分析 能否按照之一問題的解法,每個教室安排盡可能多的活動,即按結束時間排序,再貪心選擇不衝突的活動,安排乙個教室之後,剩餘的活動再分配乙個教室,繼續貪心選擇 反例 a 1,2 b 1,4 c ...