最大子段和問題(分治)時間複雜度O N

2021-10-22 14:29:07 字數 1592 閱讀 2190

succ[i] 儲存以 i 結尾的最大區間和左端點的下標

pred[i] 儲存以 i 開頭的最大區間和右端點的下標

#include

#include

#include

#include

#define x first

#define y second

using

namespace std;

typedef pair<

int,

int> pii;

const

int n =

1e6+10;

int n, a[n]

;int sum[n]

, pred[n]

, succ[n]

;pii work

(int l,

int r)

int mid =

(l + r)/2

; pii l_ans =

work

(l, mid)

; pii r_ans =

work

(mid +

1, r)

;int ans_cross_mid = sum[pred[mid +1]

]- sum[succ[mid]-1

];int ans_left = sum[l_ans.y]

- sum[l_ans.x -1]

;int ans_right = sum[r_ans.y]

- sum[r_ans.x -1]

;int succ_update = sum[r]

- sum[succ[mid]-1

];if(succ_update >= sum[r]

- sum[succ[r]-1

])int pred_update = sum[pred[mid+1]

]- sum[l-1]

;if(pred_update >= sum[pred[l]

]- sum[l-1]

)if(ans_left >= ans_right)

else

}int

main()

if(!f)for

(int i=

1; i<=n; i++

) sum[i]

= sum[i-1]

+ a[i]

; pii ans =

work(1

, n)

;// 找到字典序最小的區間

// 去除當前答案中區間和為0的尾段

int temp =

0, r_border = ans.y;

for(

int i=ans.y; i; i--

)// 針對答案為乙個0的情況 if(

!r_border) r_border = ans.y;

// 依次輸出區間和,區間下標

cout << sum[ans.y]

- sum[ans.x -1]

<<

" "<< ans.x <<

" "<< r_border << endl;

return0;

}

時間複雜度和最大子串行問題

執行時間計算 法則1 for迴圈 乙個for迴圈的執行時間最多是該for迴圈內部那些語句 包括測試 的執行時間乘以迭代的次數。法則2 巢狀的for迴圈 從裡向外分析這些迴圈,在一組巢狀迴圈內部的一條語句的執行時間為該語句的執行時間乘以該組所有的for迴圈的大小的乘積。法則3 順序語句 將各個語句的執...

時間複雜度 最大子列和問題

給定kk k個整數組成的序列,連續子列 被定義為n i 1 njn jn j 其中 1 i j k1 le i le j le k1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各...

複雜度1 最大子列和問題

給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。輸入格式 輸入第1行給出正整數 k 100000 第2行給出k個整數,其間以空格分隔。輸出格式...