luogu P3942 浮游大陸的68號島
阿新 • • 發佈:2019-01-10
此題需要用字首和和字尾和來優化。
用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。
程式碼的話,就自己寫吧。