目录
- 昨天上午的序列 - 30pts
- 今天上午的扫除 - 100pts
- 明天上午的教室 - 100pts
- 明天上午的数组 - 100pts
- 明天上午的函数 - 100pts
题目排序太合理了,EDCBA依次变难,导致我对着A题苦思冥想了半小时...
但是A题是[LeetCode 907. 子数组的最小值之和]的换皮题(除了题目一点没变)然鹅我还是做不出正解
A-昨天上午的序列
这道题是一道单调栈的变式题;
首先经过推论我们可以得到对于一个数 a k a_k ak,它会成为 l l k × r r k × a k ll_k\times rr_k \times a_k llk×rrk×ak个区间所容纳,其中 l l k ll_k llk是它左边连续的大于它的数的个数, r r k rr_k rrk是它右边连续的大于等于它的数的个数;
我们现在就是要快速求出他们的值,很简单,用两个结构体栈维护单调递增的序列和其对应的下标即可;注意我下面两个while循环当中的比较!!!不然会WA的很惨
#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define int long long
using namespace std;
int n,a[200005],ans=0,ll[200005],rr[200005];
struct lyt{
int num,xp;//数值,下标
};
stack<lyt> l,r;
signed main(){
scanf("%lld",&n);for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);}
l.push((lyt){
0LL,0LL});r.push((lyt){
0LL,n+1});//初始化成这样可以省掉边界的特判
for