给定一个数组A,构造一个数组B,满足,B先增再减(或者只增,只减), 且 bi <= ai
使得∑bi最大
#include <algorithm>
#include <vector>
#include <stack>
#define ll long long
#define PII pair<int, int>
#define FOR(i, s, e) for (int i = s; i <= e;i++)
#define ROF(i, e, s) for (int i = e; i >= s;i--)
#define debug(a) cout << #a << "=" << a << endl;
#define pb(a) push_back(a)
#define endl '\n'
#define INF 0x3f3f3f3f
#define LNF 0x3f3f3f3f3f3f3f3f
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 7;
void init_code(){
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
}
ll a[N],n;
int nex[N],prv[N];
ll f[N],fl[N],fr[N];
void NLE(){
a[0]=-INF,a[n+1]=-INF; // 设置默认值
stack<int>st;
//求nxt
FOR(i,1,n+1){
while(!st.empty() && a[st.top()]>a[i]){
nex[st.top()]=i; st.pop();
} st.push(i);
} st.pop();
//求prv
ROF(i,n,0){
while(!st.empty() && a[st.top()]>a[i]){
prv[

这篇博客讨论了一种算法问题,涉及给定数组A,目标是构造一个新的数组B,使得B先增再减或只增只减,且满足bi <= ai的条件,同时使B的元素之和最大化。文章通过使用栈数据结构求解了next和prev数组,并采用动态规划方法找到了最优解。
最低0.47元/天 解锁文章
157

被折叠的 条评论
为什么被折叠?



