51nod1254 最大子段和 V2

2022-03-30 12:42:34 字數 974 閱讀 3681

n個整數組成的序列a[1],a[2],a[3],…,a[n],你可以對陣列中的一對元素進行交換,並且交換後求a[1]至a[n]的最大子段和,所能得到的結果是所有交換中最大的。當所給的整數均為負數時和為0。

例如:將 -4 和 4 交換,,最大子段和為11 + 4 + 13 = 28。

input

第1行:整數序列的長度n(2 <= n <= 50000)

第2 - n + 1行:n個整數(-10^9 <= a[i] <= 10^9)

output

輸出交換一次後的最大子段和。

先考慮與左邊的數字交換的情況。

列舉交換位置x,把交換後的段拆成x左邊和x右邊兩部分算。

需要事先計算出字首和、字尾和、字尾和的字尾最小值、(字首和 - 字首最大值)的字首最小值。

和右邊的數交換同理。。

1 #include2 #include3 #include4 #include5 #include6 #include7

#define ll long long

8#define ui unsigned int

9#define ull unsigned long long

10using

namespace

std;

11const

int maxn=50023,modd=1000000007;12

ll mn1[maxn],mn2[maxn],_mn1[maxn],_mn2[maxn],pr[maxn],af[maxn],ans;

13int

prmx[maxn],afmx[maxn],a[maxn];

14int

i,j,k,n,m;

1516

int ra,fh;char

rx;17 inline int

read()

2324

intmain()

view code

51nod1254 最大子段和 V2

想了很久才體會出這道題的奧妙,愛恨交加的複雜情感。思路 題目要求必須做交換操作,那麼就有以下三種情況 顯然,1 2兩種情況與交換與否無關,即只有情況3才體現出了交換的價值。那麼對於情況3我們又可以分兩類 僅分析a類情況,b類情況相似。那麼我們需要從左邊找乙個最大的數交換到子段中,設此最大的數是a k...

51nod 最大子段和

給出乙個整數陣列a 正負數都有 如何找出乙個連續子陣列 可以乙個都不取,那麼結果為0 使得其中的和最大?例如 2,11,4,13,5,2,和最大的子段為 11,4,13。和為20。輸入 第1行 整數序列的長度n 2 n 50000 第2 n 1行 n個整數 10 9 a i 10 9 輸出 輸出最大...

51nod 最大子段和

題面 以乙個長為n的數列,求連續子段的最大值。思路1直接列舉o n 3 tle穩穩的 include using namespace std int n,a 50050 ans int main ans max ans,t 更新最值 cout n return 0 字首和優化的列舉法,o n 2 還...