Feel Good
题意:在一段序列中找到一段子序列,该子序列满足:该序列中的最小值乘上该序列的和 的值最大,求出该值为什么,并且求出该序列的左右两端点。
分析:遍历最小值,以该最小值为中心,向左右两侧搜寻能满足条件的左右两端点。很明显:当找该点的左端点的时候,应该是从左向右搜寻,建立从左向右递增的栈,维护该递增栈。同样道理,寻找该点的右端点的时候,应该建立从右向左的递增栈,维护该递增栈。
当求该区间的和的时候,需要用到前缀和,求该点到最前面的和,所以求一段区间和的时候,只需要用到两端点和的差
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <stack>
using namespace std;
const int maxn = 1e6+10;
int a[maxn];
long long sum[maxn];///如果记录的是和,