POJ 2796

来源:互联网 发布:如何建立阿里云服务器 编辑:程序博客网 时间:2024/05/16 00:40

这道题同POJ 2559,粘代码稍微修改即可。

不过同样是WA掉好多次的经历。

虽然说所有数都是非负的,但不妨碍它有 1 0 这样的数据,所以要么ans的初值是负数,要么把更新答案的条件加个等于。

一开始图省事,也是习惯性的都没加。WA了好多次。

之后气急败坏,把最后一步计算过程拆开,申请了新变量,使之开起来跟清晰,没想到一个顺手写成了int,继续WA。

但后来改成了long long后竟然T,无奈写了数组手写栈才A掉。

(还是只留我一个人弱弱地在博客里自娱自乐吧)

#include <cstdio>#include <cstring>#include <algorithm>#define M 100005using namespace std;long long n, ans = -1, u, v, l[M], r[M], t[M], sum[M], s[M], top;int main(){scanf("%lld", &n);for(int i = 1; i <= n; i++) scanf("%lld", t+i), sum[i] += sum[i-1]+t[i];for(int i = 1; i <= n; i++){while(top && t[s[top]] > t[i]){r[s[top]] = i; top--;}s[++top] = i;}while(top){r[s[top]] = n+1;top--;}for(int i = n; i; i--){while(top && t[s[top]] > t[i]){l[s[top]] = i; top--;}s[++top] = i;}for(int i = 1; i <= n; i++){long long u2 = l[i]+1, v2 = r[i]-1;long long cul = sum[v2] - sum[u2-1];long long temp = cul * t[i];if(temp >= ans) ans = temp, u = u2, v = v2;}printf("%lld\n%lld %lld", ans, u, v);}

0 0