UVA 12663 水淹橋(二分)

2021-09-26 19:20:17 字數 1238 閱讀 6803

最近下了很大的雨,小p都不能開心的出去玩耍了。所以無聊的小p找事來了。

在這些天總共下了很多次雨,每次下雨後,河的水位都會上公升一些,然後雨過後水位又會下降到一定位置。在這個河上有許多橋,小p想知道在這些雨過後,有多少橋被淹沒不少於k次。

如果橋的位置高於當前水位,洪水來後,水位**,將橋淹沒(水位與橋同等高度也理解為橋被淹沒),則計為該橋被淹沒一次。第一次洪水來臨前,水位為1。

如果你還沒有理解,可以看一下下面:

兩座橋的高度分別為2和5,水位初始為1

第一次洪水水位**到6,兩座橋都被淹沒一次,然後水位下降到2

第二次洪水水位**到8,高度為5的橋被淹了(高度為2的在水裡,所以沒被又一次淹沒),然後水位下降到3

所以兩座橋被淹沒的次數分別為1 2。

input

輸入最多包含25組樣例。每組樣例第一行包括三個整數n、m、k,(1<=n,m,k<=10^5)分別表示橋的數量,洪水來臨的次數,和被淹沒不少於k次。接下來一行包含n個整數,hi表示第i座橋的高度(2<=hi<=10^8)。接下來m行,每行兩個整數ai,bi(1<=bi < ai <10^8 , ai>bi-1),分別代表洪水來時的水位高度和洪水退時水位的高度。輸入檔案大小不超過5mb。

output

對於每個樣例輸出一行,形式如"case z: ans",其中z為樣例編號,ans為被淹沒不少於k次的橋的數量。

解釋:第二個樣例,橋被淹沒的次數分別為1 2 3 2 0。

sample input

2 2 2

2 56 2

8 35 3 2

2 3 4 5 6

5 34 2

5 2sample output

case 1: 1

case 2: 3 

本題先排序,用f標記上一次退潮時的座標,再用b陣列記錄漲潮+1,b[f]-=1,f=l;主要是因為水位與橋高相等時,屬於被淹沒狀態。

**如下:

#include#include#include#include#define n 100010

using namespace std;

int a[n],b[n];

int main()

printf("case %d: %d\n",t++,ans);

} return 0;

}

UVA 12663(線段樹 二分)

題意 現在有n座橋,給出每個橋的高度,現在會發m次的洪水,每次洪水會漲至a高度,然後退回b的高度,問有多少橋至少被淹沒了k次。題解 先吐槽一下 唉,人太蠢怎麼辦?連二分都沒有想到,其實這一題的key就是想到二分,想到二分去解決,那麼這一題就是模板題了。吐槽完畢 很明顯直接模擬會超時。考慮使用二分,查...

uva 714 貪心 二分

include using namespace std const int maxm 500 int k,m,p maxm bool solve int ans else pre p i return kr k void print int ans else pre p i for int i 0 ...

UVA 11478 差分約束 二分)

題意 給定乙個有向圖,每條邊都有乙個權值,每次你可以選擇乙個結點和乙個整數的,把所有以v為終點的邊的權值減去d,把所有以v為起點的邊的權值加上d 最後要讓所有邊的權的最小值非負且盡量大 include include include include include includeusing name...