u124 環狀最大兩段子段和

2021-09-28 09:56:55 字數 2508 閱讀 6476

time limit: 1 second

memory limit: 128 mb

【問題描述】

給出一段環狀序列,即認為a[1]和a[n]是相鄰的,選出其中連續不重疊且非空的兩段使得這兩段和最大。

【輸入格式】

輸入檔案maxsum2.in的第一行是乙個正整數n,表示了序列的長度。 第2行包含n個絕對值不大於10000的整數a[i],描述了這段序列,第乙個數和第n個數是相鄰的。

【輸出格式】

輸入檔案maxsum2.out僅包括1個整數,為最大的兩段子段和是多少。

【資料規模】

對於40%的資料,有2 ≤ n ≤ 2000。 對於100%的資料,有n ≤ 200000。

sample input1

2 -4 3 -1 2 -4 3

sample output1

【樣例解釋】

一段為3 –1 2,一段為3 2

*2 -4 *3 *-1 *2 -4 *3
【題目鏈結】:

【題解】

假設最後的答案區間被塗上紅色;則最後答案一定是以下兩種形式;(把環看成是直線);

對於第一種情況,只要列舉兩個區間的斷點就可以了;

列舉前要用最大子段和問題的普通形式的陣列弄個字首和和字尾和;

列舉的時候左邊和右邊直接加起來就是兩個紅色部分的了;

而對於第二種情況

我們可以轉換成求中間兩段黑色的部分;讓它的和最小;即求兩段子段和最小;然後用總數減去它就是最大的了;

兩種情況取最大值就好;

用第二種方法求解是有條件的;

即陣列中的正數的個數要大於1個;

比如 沒有正數

5 -1 -1 -1 -1 -1

如果用了第二種答案為0(程式認為黑色部分兩段和的最小值為-5而總和為-5…);正確答案是-2,第一種才能求出來;

只有乙個正數也不行

5 -1 -1 -1 -1 5

第二種答案為5(兩個最小部分和為-4,總和為1);但是如果答案為5的話就沒有選出兩段出來,因此正確答案為第一種求出來的4才對;

【完整**】

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define ll long long

#define rep1(i,a,b) for (int i = a;i <= b;i++)

#define rep2(i,a,b) for (int i = a;i >= b;i--)

#define mp make_pair

#define pb push_back

#define fi first

#define se second

typedef pair pii;

typedef pairpll;

void rel(ll &r)

void rei(int &r)

const

int maxn = 2e5+100;

const

int dx[9] = ;

const

int dy[9] = ;

const

double pi = acos(-1.0);

int n;

int pltor[maxn],ltor[maxn],prtol[maxn],rtol[maxn],a[maxn];

int pltor1[maxn],ltor1[maxn],prtol1[maxn],rtol1[maxn];

int main()

pltor[0]=-21e8;

pltor1[0]=21e8;

rep1(i,1,n)

prtol[n+1]=-21e8;

prtol1[n+1]=21e8;

rep2(i,n,1)

int ans1 = -21e8,ans2=21e8;

rep1(i,1,n-1)

if (cnt>1 && total-ans2>ans1)

ans1 = total-ans2;

printf("%d\n",ans1);

return

0;}

洛谷1121環狀最大兩段子段和

題目描述 給出一段環狀序列,即認為a 1 和a n 是相鄰的,選出其中連續不重疊且非空的兩段使得這兩段和最大。輸入輸出格式 輸入格式 輸入檔案maxsum2.in的第一行是乙個正整數n,表示了序列的長度。第2行包含n個絕對值不大於10000的整數a i 描述了這段序列,第乙個數和第n個數是相鄰的。輸...

luoguP1121 環狀最大兩段子段和

給出一段環狀序列,即認為a 1 和a n 是相鄰的,選出其中連續不重疊且非空的兩段使得這兩段和最大。輸入格式 輸入檔案maxsum2.in的第一行是乙個正整數n n 2 105 n le 2 times 10 n 2 1 05 表示了序列的長度。第2行包含n個絕對值不大於10000的整數a i 描述...

P1121 環狀最大兩段子段和

p1121 環狀最大兩段子段和 給出一段環狀序列,選出其中連續不重疊且非空的兩段使得這兩段和最大。n 2e5 輸入樣例 1 複製 7 2 4 3 1 2 4 3 輸出樣例 1 複製 9 題解 一道好題 考慮兩種情況,o代表選擇 ooo ooo 正做一遍最大子段和,倒做一遍最大子段和兩者相加 ooo ...