这道题貌似可以用滑动窗口或者单调栈做, 但是我都没有用到。

这道题要求连续子序列中和乘上最小值最大, 那么我们就可以求出每一个元素,

以它为最小值的的最大区间的值, 然后取max就ok了。那么怎么求呢?

我可以初始化出一个第一个小于当前元素的的元素的位置, 也就是说初始化出以当前元素为最小值的
左右端点, 求出之后枚举一遍就ok了。

那么关键是怎么求呢? 这里有一点扫描法的味道。

假设当前序列为1243 以求右端点为例, 右端点的位置也就是在右侧第一个小于当前元素的元素的位置。
那么如果序列是递增的, 如开始的123, 那么123任何一个元素的右端点还没有找到, 所以继续往右。

但是如果遍历到了最右边的3, 显然左边的4 的右端点的值就是这个3, 而1 2则不是。

那么也就是说, 找到第一个不是大于前一个元素的元素之后(非递增), 那么就可以从右往左更新值, 只要左边的元素

大于这个元素, 那么就可以更新。而且只要一个更新不了, 那么左边的肯定也更新不了, 因为左边更小。

但是我们会发现, 下一次更新值的时候, 之前更新到的值还会被再扫一遍, 很浪费时间。

所以我这里用到了一个链表的结构, 更新完就在链表中去掉这个元素, 那么之后往左遍历的时候就会快很多了。

所以一个元素只会被更新到一次, 复杂度是O(n)的。

然后注意如果右边没有比自己小的元素的话, 那么就值就设置为最大右端点+1。

这样到后来算总和的时候,区间的右端点是这个数组的值-1(因为不包括右侧第一个小于当前元素的元素的位置)
那么这个时候就刚好是右半边整个区间了。
左端点类似

另外要到poj 2796去提交, UVa数据有问题。(我因此WA了好久)

#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<functional>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; const int MAXN = 112345;
typedef long long ll;
int r[MAXN], l[MAXN], a[MAXN], n;
int pre[MAXN], aft[MAXN], ans_l, ans_r;
ll sum[MAXN], ans; int main()
{
while(~scanf("%d", &n))
{
sum[0] = 0;
REP(i, 0, n)
{
scanf("%d", &a[i]);
sum[i] = (i == 0 ? 0 : sum[i-1]) + a[i];
pre[i] = i - 1; aft[i] = i + 1;
l[i] = r[i] = 0;
} REP(i, 1, n) //求右边第一个小于当前元素的元素的位置
if(a[i] < a[i-1])
{
int pos = i - 1;
while(pos >= 0 && a[pos] > a[i])
{
r[pos] = i;
pos = pre[pos];
pre[i] = pos;
}
}
REP(i, 0, n) if(r[i] == 0) r[i] = n; for(int i = n - 2; i >= 0; i--) //求左边第一个小于当前元素的元素的位置
if(a[i] < a[i+1])
{
int pos = i + 1;
while(pos < n && a[pos] > a[i])
{
l[pos] = i;
pos = aft[pos];
aft[i] = pos;
}
}
REP(i, 0, n) if(l[i] == 0) l[i] = -1; ans = -1;
REP(i, 0, n)
{
ll L = l[i] == -1 ? 0 : sum[l[i]];
ll R = sum[r[i]-1];
ll t = a[i] * (R - L);
if(ans < t)
{
ans = t;
ans_l = l[i]+2;
ans_r = r[i];
}
} printf("%lld\n%d %d\n", ans, ans_l, ans_r);
} return 0;
}

紫书 习题8-18 UVa 11536 (扫描法)的更多相关文章

  1. 紫书 习题 11-9 UVa 12549 (二分图最小点覆盖)

    用到了二分图的一些性质, 最大匹配数=最小点覆盖 貌似在白书上有讲 还不是很懂, 自己看着别人的博客用网络流写了一遍 反正以后学白书应该会系统学二分图的,紫书上没讲深. 目前就这样吧. #includ ...

  2. 紫书 习题 11-8 UVa 1663 (最大流求二分图最大基数匹配)

    很奇怪, 看到网上用的都是匈牙利算法求最大基数匹配 紫书上压根没讲这个算法, 而是用最大流求的. 难道是因为第一个人用匈牙利算法然后其他所有的博客都是看这个博客的吗? 很有可能-- 回归正题. 题目中 ...

  3. 紫书 习题8-12 UVa 1153(贪心)

    本来以为这道题是考不相交区间, 结果还专门复习了一遍前面写的, 然后发现这道题的区间是不是 固定的, 是在一个范围内"滑动的", 只要右端点不超过截止时间就ok. 然后我就先考虑有 ...

  4. 紫书 习题8-7 UVa 11925(构造法, 不需逆向)

    这道题的意思紫书上是错误的-- 难怪一开始我非常奇怪为什么第二个样例输出的是2, 按照紫书上的意思应该是22 然后就不管了,先写, 然后就WA了. 然后看了https://blog.csdn.net/ ...

  5. 紫书 习题 8-17 UVa 11536 (滑动窗口)

    这道题说连续子序列, 马上就想到滑动窗口. 注意窗口里面的元素中小于等于k的才是有效元素.记录窗口里面有效元素的个数, 满足了之后开始 缩短窗口, 如果左端点不是有效元素或者即使窗口中存在这个元素的个 ...

  6. 紫书 习题 11-10 UVa 12264 (二分答案+最大流)

    书上写的是UVa 12011, 实际上是 12264 参考了https://blog.csdn.net/xl2015190026/article/details/51902823 这道题就是求出一种最 ...

  7. 紫书 习题 11-17 UVa 1670 (图论构造)

    一开始要符合题目条件, 那么肯定没有任何一个点是孤立的, 也就是说没有点的度数是1 所以我就想让度数是1的叶子节点相互连起来.然后WA 然后看这哥们的博客 https://blog.csdn.net/ ...

  8. 紫书 习题 8-21 UVa 1621 (问题分析方法)

    知道是构造法但是想了挺久没有什么思路. 然后去找博客竟然只有一篇!!https://blog.csdn.net/no_name233/article/details/51909300 然后博客里面又说 ...

  9. 紫书 习题 10-13 UVa 11526(打表找规律+分步枚举)

    首先看这道题目,我预感商数肯定是有规律的排列的,于是我打表找一下规律 100 / 1 = 100 100 / 2 = 50  100 / 3 = 33  100 / 4 = 25  100 / 5 = ...

随机推荐

  1. .net基础总复习(1)

    第一天 1.new关键字 (1) 创建对象 (2) 隐藏从父类那里继承过来的成员 2.访问修饰符 public: 公开的,公共的. private:私有的,只能在当前类的内部访问,类中的成员, 如果不 ...

  2. 用 Java 技术创建 RESTful Web (服务 JAX-RS:一种更为简单、可移植性更好的替代方式)

    作者: Dustin Amrhein, 软件工程师, IBM Nick Gallardo, 软件工程师, IBM 出处: http://www.ibm.com/developerworks/cn/we ...

  3. 挖一挖python中的深浅拷贝问题

    前几天在做面试题的时候,遇到一个与Python深浅拷贝的问题,今天总结出来一个方法,能够快速判断在对一个对象复制后,新对象与原来对象是否会互相影响的方法. 先抛出结论,然后我们对结论进行验证~~~ 先 ...

  4. django-8-django模型系统

    <<<表关系实现>>> 1.OneToOne  models.OneToOneField('another_table', on_delete=models.CAS ...

  5. js判断 nan null undefined的方法

    收集资料如下判断: 1.判断undefined: 复制代码代码如下: <span style="font-size: small;">var tmp = undefin ...

  6. ajax的两种使用方式

    一.Ajax概述 1.什么是同步,什么是异步 同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待 卡死状态 异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都 ...

  7. shell 键盘录入和运算

    一.read 命令,从键盘读入数据,赋给变量 1.脚本代码 #!/bin/sh read arg1 arg2 echo "第一个参数: $arg1" echo "第二个参 ...

  8. 2015 Multi-University Training Contest 1 hdu 5296 Annoying problem

    Annoying problem Time Limit: 16000/8000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  9. java深克隆与浅克隆

    2015.9.19 6:45   星期五    1

  10. ASP.NET-Router配置中MapRoute的参数

    App_Start文件夹中的RouteConfig MapRoute(string name,string url); MapRoute(string name,string url,object d ...