BZOJ 2259 Oibh 新型計算機

2022-04-29 23:03:14 字數 1433 閱讀 7393

tim正在擺弄著他設計的「計算機」,他認為這台計算機原理很獨特,因此利用它可以解決許多難題。

但是,有乙個難題他卻解決不了,是這台計算機的輸入問題。新型計算機的輸入也很獨特,假設輸入序列中有一些數字(都是自然數——自然數包括0),計算機先讀取第乙個數字s1,然後順序向後讀入s1個數字。接著再讀乙個數字s2,順序向後讀入s2個數字……依此類推。不過只有計算機正好將輸入序列中的數字讀完,它才能正確處理資料,否則計算機就會進行自毀性操作!

tim現在有一串輸入序列。但可能不是合法的,也就是可能會對計算機造成破壞。於是他想對序列中的每乙個數字做一些更改,加上乙個數或者減去乙個數,當然,仍然保持其為自然數。使得更改後的序列為乙個新型計算機可以接受的合法序列。

不過tim還希望更改的總代價最小,所謂總代價,就是對序列中每乙個數操作的引數的絕對值之和。

寫乙個程式:

 從檔案中讀入原始的輸入序列;

 計算將輸入序列改變為合法序列需要的最小代價;

 向輸出檔案列印結果。

輸入檔案包含兩行,第一行乙個正整數n,n<1 000 001。

輸入檔案第二行包含n個自然數,表示輸入序列。

僅乙個整數,表示把輸入序列改變為合法序列需要的最小代價,保證最小代價小於109。

42 2 2 2

1暴力的話從i到i+a[i]+1連一條0的邊,向兩邊連對應代價的邊。

這樣邊數是o(n^2)的,考慮只保留有用的邊,只保留i->i+1(1)或i->i-1(1)。

首先,從左到右的邊一定都連,因為a[i]>=0。

從右往左的邊只保留一部分,即從最小的i+a[i]+1開始,到最後。

這樣連邊就沒問題了,跑dij即可。

**:

#include #include #include #include #include using namespace std;

using namespace __gnu_pbds;

#define n 1000050

inline char nc()

int rd()

int n,is[n],head[n],to[n<<2],nxt[n<<2],val[n<<2],cnt,a[n],dis[n],vis[n];

inline void add(int u,int v,int w)

__gnu_pbds::priority_queue>q;

int main()

for(i=2;i<=n;i++) add(i,i-1,1);

for(i=mn;i<=n;i++) add(i,i+1,1);

memset(dis,0x3f,sizeof(dis));

dis[1]=0;

q.push(make_pair(0,1));

while(!q.empty())

} }printf("%d\n",dis[n+1]);

}

bzoj2259 新型計算機 最短路建模

傳送門 好題。調整一格代價1,我們就從調整的角度入手。很明顯,我按照輸入去做,什麼代價也沒有。也就是說,我從i向i a i 1連邊,代價為0。反之,挪一位代價為1。那我們只要把所有調整邊都建出來就行。也就是說向前最多到i,向後最多到n 1。注意如果i a i 1 n 1,直接向n 1連i a i n...

COGS 2259 異化多肽

qaq 很明顯我們是可以搞一下指數生成函式的 然而複雜度是o m n2 o m n2 無法優化 換個方式做生成函式 a x 表示 質量為 x 的 氨基酸有幾類 b x i 0 a x i b x i 0 a x i 顯然答案是b x 中的n次項係數 上面的式子即為乙個無限等比數列求和 度度的公式s ...

COGS2259 異化多肽

傳送門 聽說是多項式求逆的模板題,以後不怕沒地方練多項式求逆啦哈哈 我們設使用乙個氨基酸能組成質量為 n 的多肽數量這個數列為 設它的生成函式為 a x 顯然有 begina x sum infty sum m c j i end 即 a x 的 i 次方係數即為相對分子質量為 i 的氨基酸數量。我...