高橋和低橋(STL二分查詢)

2021-08-05 20:13:31 字數 1479 閱讀 5981

有個腦筋急轉彎是這樣的:有距離很近的一高一低兩座橋,兩次洪水之後高橋被淹了兩次,低橋卻只被淹了一次,為什麼?答案是:因為低橋太低了,第一次洪水退去之後水位依然在低橋之上,所以不算「淹了兩次」。舉例說明:

假定高橋和低橋的高度分別是5和2,初始水位為1

第一次洪水:水位提高到6(兩個橋都被淹),退到2(高橋不再被淹,但低橋仍然被淹)

第二次洪水:水位提高到8(高橋又被淹了),退到3。

沒錯,文字遊戲。關鍵在於「又」的含義。如果某次洪水退去之後一座橋仍然被淹(即水位不小於橋的高度),那麼下次洪水來臨水位提高時不能算「又」淹一次。

輸入n座橋的高度以及第i次洪水的漲水水位ai和退水水位bi,統計有多少座橋至少被淹了k次。初始水位為1,且每次洪水的漲水水位一定大於上次洪水的退水水位。

input

輸入檔案最多包含25組測試資料。每組資料第一行為三個整數n, m, k(1<=n,m,k<=105)。第二行為n個整數hi(2<=hi<=108),即各個橋的高度。以下m行每行包含兩個整數ai和bi(1<=bibi-1)。輸入檔案不超過5mb。

output

對於每組資料,輸出至少被淹k次的橋的個數。

sample input

2 2 2

2 5

6 2

8 3

5 3 2

2 3 4 5 6

5 3

4 2

5 2

sample output

case 1: 1

case 2: 3

分析:這個題是 玩文字遊戲? 開始想成區間所有的點找到對應位置的加減,但是發現題目中的資料太大了,肯定不行

然後換個思路,只改找到的兩個點的位置,題目中所說 一座橋如果在下次洪水來之前仍然還是被淹沒狀態,就不算被淹,那麼就在對應小於等於a[i]的橋+1,小於等於b[i-1]的橋-1,最後遍歷相加,計算至少被淹k次的橋的個數

#include

#include

#include

#include

#include

using namespace std;

#define mem(a,n) memset(a,n,sizeof(a))

typedef long long ll;

const int n=1e5+5;

int a[n],b[n],cnt[n];

vectorvec;

int main()

int num=0,sum=0;

for(int i=0; i//

printf("%d \n",sum);

if(sum>=k)

num++;

}printf("case %d: %d\n",cas++,num);

}return

0;}

這個思路有點像單點更新,區間求和,因此也可以用樹狀陣列吧。。

暫時沒寫。。

高橋和低橋

problem description 有個腦筋急轉彎是這樣的 有距離很近的一高一低兩座橋,兩次洪水之後高橋被淹了兩次,低橋卻只被淹了一次,為什麼?答案是 因為低橋太低了,第一次洪水退去之後水位依然在低橋之上,所以不算 淹了兩次 舉例說明 假定高橋和低橋的高度分別是 5 和 2,初始水位為 1 第一...

1668 高橋和低橋

time limit 1 sec memory limit 128 mb submit 42 solved 25 submit status web board 有個腦筋急轉彎是這樣的 有距離很近的一高一低兩座橋,兩次洪水之後高橋被淹了兩次,低橋卻只被淹了一次,為什麼?答案是 因為低橋太低了,第一次...

文章標題 高橋和低橋

有個腦筋急轉彎是這樣的 有距離很近的一高一低兩座橋,兩次洪水之後高橋被淹了兩次,低橋卻只被淹了一次,為什麼?答案是 因為低橋太低了,第一次洪水退去之後水位依然在低橋之上,所以不算 淹了兩次 舉例說明 假定高橋和低橋的高度分別是5和2,初始水位為1 第一次洪水 水位提高到6 兩個橋都被淹 退到2 高橋...