1. 程式人生 > >luogu P3942 浮游大陸的68號島

luogu P3942 浮游大陸的68號島

此題需要用字首和和字尾和來優化。

用sum1[i]表示將從1號倉庫到i-1號倉庫的物品全轉移到i號倉庫的代價;

dis1[i]表示從1號倉庫到i號倉庫的距離;

tot1[i]表示從1號倉庫到i號倉庫的全部物品的個數;

sum2[i]表示將從n號倉庫到i+1號倉庫的物品全轉移到i號倉庫的代價;

dis2[i]表示從n號倉庫到i號倉庫的距離;

tot2[i]表示從n號倉庫到i號倉庫的全部物品的個數.

l r與x的關係有三種情況:

①如果x在r右邊,將l r移動到x需要從前向後運(字首和)則有:

(sum1[r]-sum1[l])//將1到 l從l移動到 r,
-tot1[l-1]*(dis1[r]-dis1[l])//減去將1到l-1從l移動到r, +(tot1[r]-tot1[l-1])*(dis1[x]-dis1[r])//加上將l到r從r移動到x;

②如果x在l左邊,將l r移動到x需從後向前運(字尾和)則有:

(sum2[l]-sum2[r])//將n到 r從r移動到 l,
-tot2[r+1]*(dis2[l]-dis2[r])//減去將n到r+1從r移動到l,
+(tot2[l]-tot2[r+1])*(dis2[x]-dis2[l])//加上將r到l從l移動到x;

③如果x在l和r中間,l到x從前向後運(字首和),r到x從後向前運(字尾和):

sum1[x]-sum1[l-1] //將1到l從l移動到x,
+sum2[x]-sum2[r+1]//將n到r從r移動到x,
-tot1[l-1]*(dis1[x]-dis1[l-1])//減去將 1到l從l移動到x,
–tot2[r+1]*(dis2[x]-dis2[r+1])//減去將n到r從r移動到x。

同時,還要注意不斷取模,不要到最後再模,以防爆long long。

程式碼的話,就自己寫吧。