ch
description
在一條環形公路旁均勻地分布著n座倉庫,編號為1~n,編號為 i 的倉庫與編號為 j 的倉庫之間的距離定義為 dist(i,j)=min(|i-j|,n-|i-j|),也就是逆時針或順時針從 i 到 j 中較近的一種.每座倉庫都存有貨物,其中編號為 i 的倉庫庫存量為 ai.在 i 和 j 兩座倉庫之間運送貨物需要的代價為 ai+aj+dist(i,j).求在哪兩座倉庫之間運送貨物需要的代價最大.1≤n≤10^6,1<=ai<=10^7.
sol
斷環為鏈,再複製一段到末尾
列舉i,我們只需要找到乙個在[i-n/2,i-1]之間找到乙個j使得(a[j]-j)最大,就求出了當前的最大代價.
找j當然不能列舉(n的範圍就在上面),可以用單調佇列維護.
具體來說,雙端單調佇列的隊頭放的是a[j]-j的最大值,以及j值(即它的序號),每次i++,把j超過範圍(
如果關於單調佇列的部分不明白,建議做luogu1886滑動視窗
至於雙端,用deque辣qwq
code
這題的code還是很好實現的 : ) 好久沒有一遍過了qwq
1 #include2 #include3 #include4view code#define rg register
5#define il inline
6#define go(i,a,b) for(rg int i=a;i<=b;++i)
7using
namespace
std;
8 il int
read()912
while(c>='
0'&&c<='9')
13return x*y;14}
15const
int n=1e6+1;16
int n,m,ans,a[n*2
];17 dequeq;
18int
main()
1929 printf("
%d\n
",ans);
30return0;
31 }
Ch5501 環路運輸 環形處理dp
有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...
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就可以...