澆水
(water.c/cpp/pas)
【題目描述】
lazychild在青島二中科技樓裡種了一排n棵樹,每棵樹都有乙個高度。他會列舉所有的區間,然後從區間中找出乙個高度最矮的樹進行澆水(照顧弱者)。由於lazychild澆完水之後就精疲力竭了,所以請你幫助他計算每棵樹都被澆了幾次水。
【輸入檔案】
第一行乙個整數n。
第二行n個整數,分別表示每棵樹的高度。
【輸出檔案】
一行n個整數用空格隔開,分別表示每棵樹被澆了幾次水。
【樣例輸入】 3
1 3 5
【樣例輸出】
3 2 1
【樣例解釋】
lazychild列舉到了6個區間分別是[1],[3], [5], [1 3], [3 5], [1 3 5],對應的最矮的樹的高度是1, 3, 5, 1, 3, 1。
【資料規模和約定】
對於40%的資料,n <= 1000
對於100%的資料,n <= 1000000,保證每棵樹的高度都不相同
【考察點】
乘法原理的運用
【思路】
首先想到的肯定是暴力列舉,但是這樣做只能通過40%的資料。於是我們就來考慮優化問題:首先來看,某棵樹要被澆水的條件是它在某區間內是最小的,於是我們就很容易想到單調佇列,但是這個區間長度不一定,所以單調佇列不能解決問題;那麼再看,我們可以發現,在某個區間內,如果某個點是最小的,那麼只要是包含這個點的子區間,都是對他澆水,於是我們就可以考慮列舉這個點,並且分別向左、向右掃瞄,找出第乙個小於他的位置,根據乘法原理,可以得出,這個點的澆水次數為l*r,但是這樣的最壞情況是n^2的(每個點都掃瞄整個數列,雖然題目保證高度不同,達不到這個程度,但是畢竟不保險)。所以我們就來思考如何在更低的時間複雜度內求出每個點的l、r:觀察可以發現,某點的l、r可以由附近的點推出(結論就不說了,自己推導看看),於是就能ac了。
【提交情況】
第1次wa6組,第2次ac
【經驗】
l*r可能會爆longint,另外這樣的語句s:=l*r,即使l、r分別沒爆longint,s是int64的,若l*r爆掉了longint,s中存的就是爆掉之後的值。因為它的計算原理是先求出l*r的32位長整,再將這個數強制轉換成64位長整……
【收穫】
經驗中的那個東西……
programwater;
var n:longint;
l,r,a:array[0..1000001]of longint;
sum:array[0..1000001]of int64;
procedureterminate;
begin
close(input);
close(output);
halt;
end;
procedureinit;
var i:longint;
begin
assign(input,'water.in');
assign(output,'water.out');
reset(input);
rewrite(output);
readln(n);
for i:=1 to n do
begin
read(a[i]);
end;
end;
functioncon1(x,t:longint):int64;
begin
if a[l[x]]a[i] thenl[i]:=con1(i-1,i)
else l[i]:=i-1;
end; //推l
for i:=n downto 1 do
begin
if a[i]>a[i+1] then r[i]:=i+1
else r[i]:=con2(i+1,i);
end; //推r
for i:=1 to n do
begin
t1:=i-l[i];
t2:=r[i]-i; //計算左邊、右邊的數
sum[i]:=t1*t2;
//萬惡的計算……
end;
for i:=1 to n do
write(sum[i],' ');
end;
begin
init;
main;
terminate;
end.
accode:
解題報告 數學
1 函式 又是函式 問題描述 話說leve最最最討厭數學,每次考試都因為數學悲劇 大頭頭還極其可惡的冒天下之大不韙的讓同學們把那本16開500頁的2012高考數學核按鈕做完 為什麼要叫核按鈕呢?你懂得 現在,leve被一道函式題難住了,為了省出更多的時間學oi,她把這道題交給了你。給定乙個函式f x...
小學數學題
小學數學題1 usetyp 1 目標 擷取字串usetyp 注意,usetyp的長度是可變的 問題 求以上字串usetyp的長度 注意usetyp的長度是不固定 設usetyp的長度 p 已知1 號的索引位置x indexof 已知理論2 字串長度 最大索引 1 所以,p x 1 3 p x 2 所...
數學題亂記
在 delta abc 中,滿足 cos 2 cfrac 判斷三角形形狀。其中 begin cos 2 cfrac cfrac cfrac sin 1 cos cfrac sin 1 cos cfrac 1 cos cfrac cos cfrac end 根據餘弦定理有 cos cfrac 所以可得...