bzoj 5045 打磚塊 優先佇列

2021-08-09 10:33:12 字數 1428 閱讀 3698

小q最近沉迷於一款新型《打磚塊》遊戲。在每局遊戲中,呈現在螢幕上的是一堵無限大小的牆壁。牆壁上鑲嵌著

無數長度為2、寬度為1的磚塊。牆壁被分成若干行,每行寬度都為1,相鄰兩個格仔形成乙個磚塊。相鄰兩行的磚

塊是間隔擺放的。牆壁從下往上行編號遞增,從左往右列編號遞增。如下圖所示:

在遊戲的一開始,有n塊磚塊消失了。如果兩塊在同一行且相鄰的磚塊都消失了,那麼玩家可以移除它們上方與它

們都相鄰的那乙個磚塊。請寫乙個程式幫助小q計算最多可以讓多少個位置沒有磚塊。

第一行包含兩個正整數n(1<=n<=100000),表示一開始消失的磚塊個數。

接下來n行,每行兩個整數x_i,y_i(|x_i|,|y_i|<=10^9)

分別表示每個消失的磚塊的位置,即左半部分位於第x_i行第y_i列。

輸出一行乙個整數,即沒有磚塊的位置個數的最大值。 7

0 00 2

2 03 1

1 33 5

0 69

用優先佇列來維護這些磚塊的順序,對於同一行的數,維護一段連續磚塊的左右區間。

//

// main.cpp

// bzoj5045

//// created by zc on 2017/10/17.

//#include #include#include#include#include#include#define ll long long

#define max(a,b) ((a)>(b))?(a):(b)

using namespace std;

int n;

struct node

};priority_queueq;

template bool read(t &ret)

while (c != '-' && c != '.' && (c < '0' || c > '9'))

sgn = (c == '-') ? -1 : 1;

ret = (c == '-') ? 0 : (c - '0');

while (c = getchar(), c >= '0' && c <= '9')

if (c == ' ' || c == '\n')

while (c = getchar(), c >= '0' && c <= '9')

ret *= sgn;

return 1;

}int main(int argc, const char * argv)

else break;

}ans+=(t.y2-t.y1)/2+1;

node p;

p.x=t.x+1;p.y1=t.y1+1;p.y2=t.y2-1;

if(p.y1<=p.y2) q.push(p);

}printf("%lld\n",ans);

}

bzoj 1029 建築搶修 貪心 優先佇列

傳送門 小剛在玩jsoi提供的乙個稱之為 建築搶修 的電腦遊戲 經過了一場激烈的戰鬥,t部落消滅了所有z部落的入侵者。但是t部落的基地裡已經有n個建築設施受到了嚴重的損傷,如果不盡快修復的話,這些建築設施將會完全毀壞。現在的情況是 t部落基地裡只有乙個修理工人,雖然他能瞬間到達任何乙個建築,但是修復...

WUST 1627 打怪遊戲(優先佇列 bfs)

time limit 1 sec memory limit 128 mb 64bit io format lld submitted 12 accepted 10 submit status web board 一顆樹有n個節點 編號從0到n 1 樹上每乙個節點可能有多隻怪物。小明在0號節點,他想要...

BZOJ 2809(優先佇列 啟發式合併)

題解 先自底向上列舉管理者x,那麼根據題意,我們就要從x的子樹中選擇盡量多的忍者,且工資總和不超過m 用乙個優先佇列 到乙個點x,就把它的兒子節點的優先佇列啟發式合併 顯然優先選工資低的,那麼維護大根堆,不停地刪堆頂,直到工資滿足預算即可 include include include includ...