BZOJ5059 前鬼後鬼的守護 堆擴充套件

2022-05-24 23:21:11 字數 2048 閱讀 9793

八雲紫的式神八雲藍有一張符卡名為[式神-前鬼後鬼的守護],這張符卡的彈幕為boss從兩側向自機發射大玉,大玉後面跟著一些小玉,形成乙個「v」字型的彈幕。然鵝蘭大人覺得這個彈幕還能再美觀一些,她想讓自己的彈幕能從左向右發射,於是她就開始了行動。

[式神-前鬼後鬼的守護]由 n波彈幕組成,每波彈幕都有乙個落到板底的位置,第i波彈幕的落地位置為xi。

為了讓彈幕能從左到右落地,藍媽需要改變一些彈幕的落地位置,使得改變後的落地位置的座標不遞減,即

。然鵝改變彈幕的方向是很累的,藍媽每將一波彈幕的座標增加或減少1,就會花費一單位的能量,即

藍媽想確定乙個最終的修改方案使得他花費的能量最少,於是她將設計修改方案的任務交給了自己的式神八雲橙。

這可急壞了我們的橙喵,她只是連曼哈頓距離都不會算的年幼式神,你能幫助她完成這個任務嗎?

輸入檔案第一行為乙個正整數n ,意義如題目所示。接下來一行n個正整數,第i個整數代表xi 。

n<=5*10^5,xi<=10^9

輸出乙個整數,為最小消耗的能量值。

7 1 3 2 4 5 3 9

3 將第二波彈幕的落地位置由3改為2 ,花費為1 ,將第六波由3 改為5 ,花費為2 ,總花費為1+2=3 ,形成了乙個不下降序列:1,2,2,4,5,5,9為最優解(不一定為唯一最優解)

bzoj上最短的**就這樣貼出來了

首先我們考慮已經維護好的乙個區間

我們考慮新加入乙個小於最大值的點(大於最大值直接加入)

就像這樣

我們可以花費ab

s(va

lmax

−val

a)' role="presentation">abs

(val

max−

vala

)abs

(val

max−

vala

)的代價把a和max變成這區間中的任意乙個數,所以也就實現了維護

所以我們其實就相當於是把max變成了a,並付出了ab

s(va

lmax

−val

a)' role="presentation">abs

(val

max−

vala

)abs

(val

max−

vala

)的代價

這樣之後我們又可以從當前的max開始維護

這樣舉個栗子:

新加入的點小於原來的a怎麼辦?霧

我們可以用ab

s(va

lmax

(c)−

valh

)' role="presentation">abs

(val

max(

c)−v

alh)

abs(

valm

ax(c

)−va

lh)的代價把c和h變成這區間中的任意乙個數,在這裡我們可以直接將就上一次剩下的a,其實也不影響,所以c和h又相當於變成了兩個h

可以證明一定是可以有一種方式使得單調不減

然後就寫一段小小的**

非常方便快捷

#include

using

namespace

std;

priority_queue q;

int n,x;

long

long ans=0;

int main()

}printf("%lld",ans);

}

5 05 C語言 函式

函式是什麼?常見的庫函式都有哪些?自定義函式的一般形式是什麼?形參和實參是什麼?函式的呼叫如何實現?作業 1 動態輸入三個整數,寫乙個函式,返回最大值並輸出該值 intgetmax intx,inty,intz 2 寫乙個函式,返回輸入整數 大於 999小於 10000 的每位的數字之和。intge...

505 動態區間異或和

給定乙個由n個正整數組成的序列 兩種操作 1 x y 表示將 axax的值改為y 2 x y 表示詢問區間 x,y 的異或和 第一行,兩個正整數n和m,用空格隔開。第二行,n個正整數表示序列。以下m行,每行三個數,表示乙個操作,格式如題面。對於每個操作2詢問佔一行乙個整數。10101 97810 9...

505 動態區間異或和

505.動態區間異或和 統計描述 提交自定義測試 題目描述 給定乙個由n個正整數組成的序列 兩種操作 1 x y 表示將 axax的值改為y 2 x y 表示詢問區間 x,y 的異或和 輸入描述 第一行,兩個正整數n和m,用空格隔開。第二行,n個正整數表示序列。以下m行,每行三個數,表示乙個操作,格...