当前位置: 首页 > news >正文

UVA1619 Feel Good(链表+前缀和)

传送门


在这里插入图片描述
1.题目大意:给出一个长度为n的正整数序列a,求一段连续的子序列a1,a2,…,an使得(a1+a2+…+an)*min{a1,a2,…,an}尽量大。如果有多解输出长度最短且最左边的解

2.第一眼想到了尺取,但是感觉这样O(n2)要超时。这里不但区间长度会约束答案,而且区间最小值也会约束答案,没想到怎么实现tcl

3.实际上是链表的思想,对于每个数,我们以它为这个区间的最小值,那么看看这个数向两边能拓展的最大区间是多大——该区间内这个数为最小值,这样之后如果我们暴力求这段区间,肯定超时,因此这里用到了单调栈和链表的思想:在扫描过程中维护一个向前延伸的最大位置,如果前面一个元素不比它小,那么前面一个元素能延伸到的位置,当前元素也可以延伸到,然后类似链表往前延伸,右边同理,这样的话时间复杂度实际上只有O(n)

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <math.h>
#include <cstdio>
#include <string>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
#define lowbit(x) (x&(-x))
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
const double eps=1e-8;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const ll INF=1e18;
const int Mod=1e9+7;
const int maxn=2e5+10;

int a[maxn],L[maxn],R[maxn];
ll sum[maxn];  //1e5个1e6数会爆int

int main(){
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int n,kase=0;
    while(cin>>n){
        for(int i=1;i<=n;i++){
            cin>>a[i];
            sum[i]=sum[i-1]+a[i];
            L[i]=R[i]=i;  //初始设置向右向左扩展的长度均为0
        }
        a[0]=a[n+1]=-1;  //因为序列都是正数,因此取
        for(int i=1;i<=n;i++){
            while(a[i]<=a[L[i]-1]) L[i]=L[L[i]-1];  //细细体会
        }
        for(int i=n;i>=1;i--){
            while(a[i]<=a[R[i]+1]) R[i]=R[R[i]+1];
        }
        ll ans=1LL*a[1]*a[1],l=1,r=1;  //ans,l,r都设置为第一组数据,否则会wa
        for(int i=1;i<=n;i++){
            ll res=(sum[R[i]]-sum[L[i]-1])*a[i];
            if(res>ans || (res==ans && (R[i]-L[i])<(r-l))){ //只需设置>就能保住是最左边,第二个判断条件为长度最短
                ans=res;
                l=L[i],r=R[i];
            }
        }
        if(kase++) cout<<endl;  //相邻输出有多余的回车,首尾无
        cout<<ans<<endl;
        cout<<l<<" "<<r<<endl;
    }
    return 0;
}




相关文章:

  • Codeforces Round #637 (Div. 2) D. Nastya and Scoreboard(位运算dfs/记忆化搜索)
  • Cocoa应用程序基本运行过程
  • 我们的内心都有伤痕
  • Codeforces Round #638 (Div. 2) B. Phoenix and Beauty (构造)
  • Codeforces Round #638 (Div. 2) C Phoenix and Distribution(思维/构造)
  • Mac Application GDB Usage
  • “Shopee杯“e起来编程暨武汉大学2020年大学生程序设计大赛决赛
  • iPhone开发秘籍一书中的翻译错误
  • 2020WHU校赛 I - Interesting Matrix Problem(规律+整除分块)
  • UVA1025 A Spy in the Metro (dp)
  • 欢迎大家来这里学习
  • UVA437 The Tower of Babylon(记忆化搜索)
  • MySQL启多个实例
  • UVA116 Unidirectional TSP(dp/多段图的最短路)
  • 忍受未知很重要
  • 2017 年终总结 —— 在路上
  • 2017年终总结、随想
  • Apache Spark Streaming 使用实例
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Git初体验
  • Laravel 菜鸟晋级之路
  • Linux gpio口使用方法
  • Median of Two Sorted Arrays
  • SpriteKit 技巧之添加背景图片
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • web标准化(下)
  • 成为一名优秀的Developer的书单
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 十年未变!安全,谁之责?(下)
  • 线性表及其算法(java实现)
  • 小程序 setData 学问多
  • 学习使用ExpressJS 4.0中的新Router
  • nb
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • (0)Nginx 功能特性
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (2)STL算法之元素计数
  • (pojstep1.1.2)2654(直叙式模拟)
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (转)c++ std::pair 与 std::make
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • ./configure,make,make install的作用(转)
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .net framework4与其client profile版本的区别
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .net 程序发生了一个不可捕获的异常
  • .NET 服务 ServiceController
  • .NET单元测试
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .net与java建立WebService再互相调用