3662 最大上公升子串行和

2022-09-29 15:33:18 字數 1703 閱讀 6132

給定乙個長度為 \(n\) 的整數序列 \(a_1,a_2,…,a_n\)。

請你選出乙個該序列的嚴格上公升子串行,要求所選子串行的各元素之和盡可能大。

請問這個最大值是多少?

第一行包含整數 \(n\)。

第二行包含 \(n\) 個整數 \(a_1,a_2,…,a_n\)。

輸出最大的上公升子串行和。

資料範圍

對於前三個測試點,\(1≤n≤4\)。

對於全部測試點,\(1≤n≤10^5,1≤a_i≤10^9\)。

輸入樣例1:

2

100 40

輸出樣例1:
100
輸入樣例2:
4

1 9 7 10

輸出樣例2:
20
樣例解釋

對於樣例 \(1\),我們只選取 \(100\)。

對於樣例 \(2\),我們選取 \(1,9,10\)。

樹狀陣列,dp

考慮優化,其中關鍵在於找出滿足 \(a[i]>a[j]\) 的 \(f[j]\) 的最大值,可以用樹狀陣列處理,這裡樹狀陣列用來處理當前小於 \(a[i]\) 的最大的 \(f[j]\),同時由於值過大可離散化

// problem: 最大上公升子串行和

// contest: acwing

// url:

// memory limit: 256 mb

// time limit: 2000 ms

// // powered by cp editor (

// %%%skyqwq

#include //#define int long long

#define help

#define pb push_back

#define fi first

#define se second

#define mkp make_pair

using namespace std;

typedef long long ll;

typedef pairpii;

typedef pairpll;

template bool chkmax(t &x, t y)

template bool chkmin(t &x, t y)

template void inline read(t &x)

while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();

x *= f;

}const int n=1e5+5;

int n,a[n];

ll f[n],tr[n];

vectorv;

int find(int x)

void add(int x,ll y)

ll ask(int x)

int main()

sort(v.begin(),v.end());

v.erase(unique(v.begin(),v.end()),v.end());

for(int i=1;i<=n;i++)

cout<<*max_element(f+1,f+1+n);

return 0;

}

最大上公升子串行和

3532 最大上公升子串行和 檢視 提交 統計 提問 總時間限制 1000ms 記憶體限制 65536kb 描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 i...

最大上公升子串行和

描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等。這...

最大上公升子串行和

題目描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等...