小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...