CH5501 環路運輸 環形 單調佇列

2022-04-28 20:09:14 字數 1114 閱讀 9107

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 #include4

#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 }

view code

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就可以...