時間限制: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行,...