可以證明以下幾個結論。
所求的f(x
,y) 即為從第一行的某一點開始往下走,只能向下或向右下走,到點(x
,y) 的最短路。
所走的路徑,只在某一列有豎直向下的路徑,在其他列都為斜向下。
進一步地,一定是從起點開始往下,然後一直斜向下。如果i
y 且ai
≥aj ,那麼
i 一定不是最優解。記a
i的字首和為si
,假設我們從點(1
,p) 走到(x
,y) ,那麼路徑長度是sy
−sp+
(x−y
+p)a
p 。令上式=b
+sy ,我們得到 pa
p−sp
=(y−
x)ap
+b把a
p 看成橫座標,pa
p−sp
看成縱座標,上式可以斜率優化。根據結論
4 ,我們可以直接用單調棧維護下凸殼,每次詢問在上面二分。
#include
#include
#include
using
namespace
std;
const
int maxn=200010;
vector
int,int> > v[maxn];
int a[maxn],s[maxn],ans[maxn],sta[maxn],n,q,top;
int rd()
return x;
}double getk(int u,int v)
int main()
q=rd();
for (int i=1;i<=q;i++)
for (int i=1;i<=n;i++)
ans[(*it).second]=s[i]-s[sta[l]]+a[sta[l]]*(x-i+sta[l]);}}
for (int i=1;i<=q;i++) printf("%d\n",ans[i]);
}
51nod 1488 帕斯卡小三角
f 1,j a j 1 j n.f i,j min f i 1,j f i 1,j 1 a j 2 i n,i j n.a是乙個長度為n的陣列。現在有若干個詢問,輸入x,y,求f x,y n,q 100000 顯然要求的是從第一層某個點 1,s 到 x,y 的最短路徑。yy一下不難發現路徑必然是從某...
css實現小三角
其實早都做過用css來實現小三角的箭頭符號了,不過一直都沒靜下心來仔細研究,今天正好多看了些,都說好記性不如爛筆頭,把所了解到的趕緊記錄下來。大致有兩種方法 邊框法和字元法。邊框法就是利用盒子的邊框變化組合形成的各種三角 字元法就是採用菱形的字元 然後決定定位把多餘的部分溢位掉,該種方法只適合三角和...
css3實現小三角
利用css3的新特性可以完成很多圖形的構建,下面演示如何利用border的特性構建乙個小三角。我們首先新建乙個div,給這個div設定class demo 然後給demo設定如下屬性 demo顯示效果是這樣的 可以看到四個不同顏色的三角形連在一起。我們只想要乙個,比如向上的紅色三角形,怎麼辦,那就是...