一組正整數,分別表示由正方體迭起的柱子的高度。若某高度值為x,表示由x個正立方的方塊迭起(如下圖,0<=x<=5000)。找出所有可能積水的地方(圖中藍色部分),統計它們可能積水的面積總和(計算的是圖中的橫截面積。乙個立方體的位置,為乙個單位面積)。
如圖:柱子高度變化為 0 1 0 2 1 2 0 0 2 0
圖中藍色部分為積水面積,共有6個單位面積積水。
輸入格式:
兩行,第一行n,表示有n個數(3<=n<=10000)。第2行連續n個數表示依次由正方體迭起的高度,保證首尾為0。
輸出格式:
乙個數,可能積水的面積。
輸入樣例#1:
100 1 0 2 1 2 0 0 2 0
輸出樣例#1:
6找出最高的一根柱子,從最高的一行起,一行一行向下掃瞄,每行掃瞄一遍找出最左邊的一根和最右邊的一根,他們之間每乙個沒有柱子的地方貢獻乙個面積的積水(好像沒毛病),然後把每行答案加起來,就得到總的可能積水面積了
維護字首最大值fro[i]和字尾最大值beh[i],對每一列對面積的貢獻為h[i]-min(fro[i],beh[i]),然後從左到右,對每一列都有ans+=h[i]-min(fro[i],beh[i])(這不是顯然的嗎)
維護乙個單調棧,還沒搞懂
以上思路原始碼
自己的思路:對所有h[i],在記錄了原本位置的情況下對高度進行排序,然後列舉:對第一高的和第二高的(一樣高也可以)之間所有列統計答案,標記已統計過(因為後面不能重複計算這一列,降序排序保證了越靠前計算獲得水位越高),對第二高和第三高之間區間執行相同操作,對第三高和第四高區間之間執行相同操作……,第n-1高和第n高(最矮)之間區間執行相同操作,最後輸出答案,ac
#include#includeusing
namespace
std;
struct
datad[100100
];int
n;bool vis[100100]=;//
判斷是否放過水
int h[100100]=;//
按順序排列的柱子高度
int ans=0
;int cmp(const data & a,const data &b)
intmain()
sort(d,d+n,cmp);
for(int i=0;i1;i++)}}
printf("%d
",ans);
return0;
}
洛谷 P1318 積水面積
一組正整數,分別表示由正方體迭起的柱子的高度。若某高度值為x,表示由x個正立方的方塊迭起 如下圖,0 x 5000 找出所有可能積水的地方 圖中藍色部分 統計它們可能積水的面積總和 計算的是圖中的橫截面積。乙個立方體的位置,為乙個單位面積 如圖 柱子高度變化為 0 1 0 2 1 2 0 0 2 0...
洛谷P1318積水面積
講講思路 從雙向記錄兩邊到當前位置的最大的高度 設兩個陣列l i r i 分別記錄從前往後和從後往前到i位置的最大高度 然後在每個位置加上其能夠裝的水的量,見公式sum min l i r i hi i 當前位置水能裝的最大高度減去下面磚的高度即為當前位置能裝的水。上ac include const...
洛谷P1318 積水面積
一組正整數,分別表示由正方體疊起的柱子的高度。若某高度值為 x 表示由 x 個正立方的方塊迭起 如下圖,0 x 5000 找出所有可能積水的地方 圖中藍色部分 統計它們可能積水的面積總和 計算的是圖中的橫截面積。乙個立方體的位置,為乙個單位面積 如圖 柱子高度變化為 0 1 0 2 1 2 0 0 ...