準備 破環成鏈 差分

2021-08-31 03:33:33 字數 1279 閱讀 7930

【一句話題意】有乙個環形的序列標號從1到n,每個元素有乙個隨機值ai,現在允許環形序列每個點同時順時針轉x圈,求使σi=

1n∣a

i−i∣

\sigma^n_ |ai-i|

σi=1n​

∣ai−

i∣最小的方案,輸出最小值。

n<=1e6

【分析】由於元素是隨機的,但是標號十分有規律的,所以我們轉而考慮固定序列,旋轉標號。

顯然當標號i大於ai時,右移i,那麼ai會對答案做減一的貢獻;

當標號i小於等於ai但不等於1時,右移i,那麼ai會對答案做加一的貢獻;

當i等於1時,右移標號會從1突然變成n,暴力特判即可。

顯然定義乙個陣列為「當i點為1,右移時答案的差值(不考慮標號為1的點)」,預處理每個點,對乙個區間同時加一,再對乙個區間做減一操作,再單點詢問。顯然樹狀陣列o(nlogn)可過。

然而,破環成鏈之後直接差分再o(n)統計,可以把複雜度降到o(n)。。。。

那我考場上在 ** 做什麼

【code】

考場上用樹狀陣列ac的程式

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

2e6+

1000

;ll n,a[maxn]

;inline

void

read

(ll &x)

struct szsz

void

add(

int l,

int r)

intask

(int num)

}t1,t2;

intg

(int x)

intmain()

if(a[i]

} ll ans=

1ll<<

60,res=0;

for(

int i=

1;i<=n;i++

) res+

=abs

(a[i]

-1ll

*i);

ans=res;

for(

int i=

1;i) cout

}

壞掉的項鍊 破環成鏈

你有一條由n個紅色的,白色的,或藍色的珠子組成的項鍊 3 n 350 珠子是隨意安排的。這裡是 n 29 的二個例子 第一和第二個珠子在中已經被作記號。brbrrrbbbrrrrrbrrbbrbbbbrrrrb 假如你要在一些點打破項鍊,展開成一條直線,然後從一端開始收集同顏色的珠子直到你遇到乙個不...

c aw 能量項鍊(破環成鏈)

對於相鄰的兩顆珠子,前一顆珠子的尾標記一定等於後一顆珠子的頭標記。因為只有這樣,通過吸盤 吸盤是mars人吸收能量的一種器官 的作用,這兩顆珠子才能聚合成一顆珠子,同時釋放出可以被吸盤吸收的能量。如果前一顆能量珠的頭標記為m,尾標記為r,後一顆能量珠的頭標記為 r,尾標記為 n,則聚合後釋放的能量為...

Freeman鏈碼差分

在看岡薩雷斯的 數字影象處理 matlab版 時,書上好像並沒有說細說這個freeman鏈碼的差分是怎樣計算的,所以自己想了一會,覺得可能是這樣計算的 例如書上舉的例子 第328頁 是4方向碼是10103322,則一階差分是31333030。一階差分中第一位3是這麼來的,鏈碼中第一位1指向鏈碼中第二...