有n座倉庫,然後是乙個環,兩個倉庫之間的運輸距離為ai
+aj+
dis(
i,j)
a i+
aj+d
is(i
,j
)dis
(i,j
)=mi
n(|i
−j|,
n−|i
−j|)
d is
(i,j
)=mi
n(|i
−j|,
n−|i
−j|)
我們將a複製乙份放在原陣列後面,然後就變成了2*n的線性。然後我們列舉i,之後i和j的距離為ai
+aj+
i−j ai+
aj+i
−j
,於是我們可以找到在n/2範圍之內的最小的aj
−ja j−
j,於是我們可以用單調佇列維護一下就好了。
#include
#include
#include
#define n 2000010
using
namespace
std;
int n,a[n],maxs;
deque
q;int main()
for(int i=1;i<=2*n;i++)
printf("%d",maxs);
}
CH5501 環路運輸 環形 單調佇列
ch description 在一條環形公路旁均勻地分布著n座倉庫,編號為1 n,編號為 i 的倉庫與編號為 j 的倉庫之間的距離定義為 dist i,j min i j n i j 也就是逆時針或順時針從 i 到 j 中較近的一種.每座倉庫都存有貨物,其中編號為 i 的倉庫庫存量為 ai.在 i ...
CH 5501 環路運輸 DP 單調佇列
n nn個在乙個環上的倉庫,兩兩之間運貨的代價是a i a j m in i j n i j a i a j min i j n i j a i a j min i j n i j 求最大代價。環上的dp固然不好做,可以先把環拆成鏈,再拷貝乙份。成為一條長度為2n2n 2n的鏈。for int i ...
CH 5501 環路運輸 DP 單調佇列
nn 個在乙個環上的倉庫,兩兩之間運貨的代價是a i a j m in i j n i j a i a j min i j n i j 求最大代價。環上的dp固然不好做,可以先把環拆成鏈,再拷貝乙份。成為一條長度為2n2 n的鏈。for int i 1 i n i 那麼接下來的dp就再鏈上dp就可以...