AcWing 4487. 最长连续子序列 单调栈上二分 数组模拟栈的好处
题面
题解思路
首先讲公式化简为
sum[r] - 100r > sum[l] - 100l
sum为前缀和。
这一步是很容易想到的,这样就只有一个变量了。
然后就是怎么通过枚举一个i来确定前面的数小于自己且最远的数是什么。
想了很久没想出来,y总这里使用了单调栈上二分来处理,之前没有见到过这种操作。
先使用一个降序的单调栈来保证单调栈上的每个数都是最远的(手模理解)。
如果这个数比栈顶还小,那肯定取不到答案,我们将它入栈。(如果一个数能取到答案,我们肯定不入队,因为在它前面肯定有更小的数)
如果比栈顶大,说明存在答案。
我们直接对单调栈上二分。
单调栈的题还是写太少了。
AC代码
/*从你的全世界路过.*/
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long longusing namespace std;const int INF = 0x3f3f3f3f;
const int N = 1000100;
int a[N] ;
long long sum[N] ;
int stk[N] ;
int n ;
void solve()
{cin >> n ;for (int i = 1 ; i <= n ; i++ )cin >> a[i] ; for (int i = 1 ; i <= n ; i++ ){sum[i] = sum[i-1] + a[i] - 100 ; }int top = 0 , res = 0 ; stk[++top] = 0 ; for (int i = 1 ; i <= n ; i++ ){if ( sum[stk[top]] > sum[i] ) stk[++top] = i ; else if ( sum[stk[top]] < sum[i] ) {int t1 = 1 , t2 = top ; while ( t1 < t2 ){int mid = t1 + t2 >> 1 ;if ( sum[stk[mid]] < sum[i] ) t2 = mid ; elset1 = mid + 1 ; }res = max(res,i-stk[t2]) ; }}cout << res << "\n" ;
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);solve() ;return 0 ;
}
AcWing 4487. 最长连续子序列 单调栈上二分 数组模拟栈的好处相关推荐
- java实现最长连续子序列_最长公共子序列 ||
问题:在 前一篇文章 最长公共子序列 | 的基础上要求将所有的最长公共子序列打印出来,因为最长公共子序列可能不只一种. 难点:输出一个最长公共子序列并不难,难点在于输出所有的最长公共子序列,我们需要在 ...
- 六、使用数组模拟栈的思路及代码实现
使用数组模拟栈的实现过程 1.栈的介绍 (1) 栈的英文为(stack) (2) 栈是一个先入后出(FILO-First In Last Out)的有序列表. (3) 栈(stack)是限制线性表中元 ...
- 字符串得结果!Java数组模拟栈以实现中缀表达式综合计算器,字符串表达式计算器
文章目录 数组模拟栈类 中缀表达式计算器类(测试类) 数组模拟栈类 主要实现栈的一些基本功能,以及在该场景下的功能. //先创建一个栈 class AStack {private int maxSiz ...
- 数据结构之数组模拟栈
栈的特点即先进后出,采用数组模拟栈,实现栈的这一特性主要是靠定义一个指针(索引). 指针的初始位置指向的是-1 以下给出代码: package com.ebiz.stack;/*** @author ...
- 数据结构 - 栈(数组模拟栈操作)
数组模拟栈操作 package stack;import java.util.Scanner;public class ArrayStackDemo {public static void main( ...
- java 模拟栈底层用数组_java用数组模拟栈
package stack2; public interface StackADT { /** * 添加元素 * @param object */ void push(Object object); ...
- 最长连续子序列nlogn算法
最长上升子序列(LIS)长度的O(nlogn)算法 标签: 算法search优化存储 2012-04-18 19:38 14031人阅读 评论(5) 收藏 举报 分类: 资料学习(15) 解题报告 ...
- AcWing 897. 最长公共子序列(LCS朴素版)
题目连接 https://www.acwing.com/problem/content/899/ 思路 我们定义f[i][j]f[i][j]f[i][j]表示的是a串中长度为i和b串长度为j的最长公共 ...
- AcWing 895. 最长上升子序列(LIS朴素做法)
题目连接 https://www.acwing.com/problem/content/897/ 思路 因为数据范围很小,所以我们定义f[i]f[i]f[i]表示的是以第i个元素结尾的最长上升子序列的 ...
- ACwing 895 - 最长上升子序列(最长上升子序列模型)
给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少. 输入格式 第一行包含整数N. 第二行包含N个整数,表示完整序列. 输出格式 输出一个整数,表示最大长度. 数据范围 1 ≤ N ≤ ...
最新文章
- android wear 兼容问题,【悲剧了】仅 1/4 安卓手机兼容 Android Wear - 爱应用
- 数据库索引的作用和长处缺点
- php 字符串 中文位置,怎样查找中文字符的位置呢
- 小朋友嘴里的“金钥匙”,良品小食仙、小鹿蓝蓝们要如何拿到?
- session共享怎么做的(分布式如何实现session共享)?
- .dat文件写入byte类型数组_《计算机导论》课程实验报告(文件)
- MySQL存储过程 游标
- Cocos2d BMFont解析
- 设计模式笔记之六:生产消费者模式
- 【转】基础知识系列2--线性表之链表
- 【python】谷歌翻译
- 可在手机浏览器下载文件的方法
- 电子护照阅读器|机场海关边检酒店必备
- Linux每日一讲:awk命令
- 秋风荷桂香 晚风拂夕阳
- 前端框架ice飞冰与java后台交互分享
- Eclipse用户工作台界面简介
- re模块,hashlib模块
- 2015网易游戏校园招聘笔试题 研发岗
- 国开计算机网络 形考4,国开电大计算机网络(本)形考作业四参考答
热门文章
- 采用python语言对csv文件写入、最可能采用的字符串方法_2020尔雅无人机原理与构造答案章节答案...
- 《计算机入门》模拟卷 b卷,《计算机入门》模拟试卷B.doc
- kube-proxy 部署
- 一个字等于多少个字节?
- 对计算机科学的总体认识,浅谈对计算机科学与技术的认识
- android word分页,word文档如何设置分页以及取消分页
- python求学生成绩平均值_python 计算student_grade.txt 中 语文成绩的平均值, 找出数学成绩最高的学生是谁...
- 自家主机建云服务器_用云主机还是自己建服务器好
- 黑苹果双系统时间不一致_黑苹果系统与windows时间差问题的解决
- JS用图片制作的走动的时间表