E 海嘯 牛客競賽

2021-09-10 13:48:27 字數 2380 閱讀 1004

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 262144k,其他語言524288k

64bit io format: %lld

有乙個沿海地區,可以看作有n行m列的城市,第i行第j列的城市海拔為h[i][j]。

由於沿海,所以這個地區經常會發生海嘯。

海嘯發生時,部分城市會被淹沒,具體來說,海水高度會達到d,因此海拔低於d的城市都會被淹沒。

現在有q次詢問,每次問你乙個矩形區域中,有多少城市不會被淹沒。

第一行三個整數n,m,d,具體含義見題目描述。

接下來n行,每行m個整數,其中第i行第j列的整數為h[i][j],具體含義見題目描述。

第n+2行乙個整數q,表示詢問數。

接下來q行,每行四個整數a,b,x,y,

表示詢問從第a行第b列到第x行第y列的矩形地區中,有多少地區不會被淹沒。

即有多少個i,j,滿足 a≤i≤x,b≤j≤ya≤i≤x,b≤j≤y ,且 h[i][j]≥dh[i][j]≥d 。

共q行,第i行乙個整數,表示第i個詢問的答案。
示例1

3 3 3

1 2 3

2 1 5

4 3 2

21 2 2 3

2 1 3 3

2

3

1≤n×m≤10^6

1≤q≤10^5

0≤d,h[i][j]≤10^9

1≤a≤x≤n,1≤b≤y≤m

筆者剛看到題,海平面,城市,淹沒等等字眼第一反應搜尋,讀完題面,發現不需要搜尋因為題目中城市(點集)之間沒有連通關係,城市之間是不相關的。

接下來下意識的覺得,哇,連搜尋都不用,那不是好簡單,看來這題是模擬題意。

順著思路於是開始著手寫**,這個時候問題出現了行列範圍是1≤n×m≤10^6,這個陣列怎麼開?如果直接開二維陣列h[1000001][1000001]是不合理的,這個陣列一共有10^6*10^6=10^12數量級的元素,空間爆掉了。那麼這裡說三種方法

1、官方給出的方法是定義乙個**h二維指標陣列,讀取m,n後new重定義陣列大小。

2、使用c++stl庫封裝的vector動態陣列。

3、因為行*列<=10^6,可以用乙個一維陣列h[1000001],通過下標對n列的整除性實現降維。即每個h[i]相當於二維陣列的s[i/n][i%n]。

陣列考慮完了,下面開始模擬題意。

這時又有新的問題了,直接遍歷是不可行的,如果每次詢問都進行遍歷那麼操作次數是q*(x-a)*(y-b)在本題的資料規模下,時間複雜度太高了,會超出時間限制。那麼需要進行預處理,使用字首和的思想。用陣列pre[x][y]的值表示,存放從1,1到x,y這個矩形內的不會被淹沒的城市數,則矩形x1y1x2y2內的不會被淹沒的城市數量可表示為 pre[x2][y2] - pre[x2][y1-1] - pre[x1-1][y2] + pre[x1-1][y1-1]。

(求pre[x][y]的值if(x >= d)pre[i][j] = 1 + pre[i-1][j] + pre[i][j-1] - pre[i-1][j-1];

else pre[i][j] = pre[i-1][j] + pre[i][j-1] - pre[i-1][j-1];

就是反向使用上面的字首和思路,即累加的思想

陣列降維

//陣列降維

#includeusing namespace std;

int h[1000005],s[1000005];

int main()

t=0;

for(int i=0;i=d)t++;

s[i*n]=t;

} for(int i=1;i=d)t=1;

s[i*n+j]=t+s[(i-1)*n+j]+s[i*n+j-1]-s[(i-1)*n+j-1];

} }scanf("%d",&q);

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

return 0;

}

動態陣列 

//動態陣列

#include#include#includeusing namespace std;

vector> e;

int n,m;

int main()

int q;

scanf("%d",&q);

for(int a,b,c,d;q--;)

return 0;

}

牛客 組隊競賽

題目解析 此題題意,這是乙個求最優解的問題,三人一對,由首行n輸入的值來確定隊伍數目,我們為保證所有隊伍的水平值總和為最大值,則需讓隊伍中第二大的值盡量大。所以將最大值放到最右邊,最小是放左邊.解題思路 1.本題的主要思路是貪心演算法,就是每次選值時都選當前能看到的區域性最優解,所以這裡的貪心就是保...

牛客競賽Anagram

一 題目 二 題意 給定兩個長度一樣的字串 均為大寫字母 計算將a變為和b一樣的構成最少需要多少步。三 思路 將a和b分別按字母順序排序,由於可能存在輪迴向前找的情況,為了避免繞大圈,所以直接將a的當前字母和b的尾巴上未匹配的字母進行操作。四 include include include intc...

牛客競賽 美食(貪心)

題目描述 小b喜歡美食。現在有n個美食排成一排擺在小b的面前,依次編號為1 n,編號為i的食物大小為 a i 即足夠小b吃 a i 口。小b每次會吃兩口,這兩口要麼是編號相同的美食,要麼是編號之差的絕對值為1的美食。小b想知道,她最多能吃幾次?輸入描述 第1行乙個正整數n,表示美食個數 接下來n行,...