首页 > 其他分享 >奶牛排队【题解】

奶牛排队【题解】

时间:2023-04-05 16:12:30浏览次数:41  
标签:minn 后缀 题解 排队 back int 最小值 奶牛

题目描述

奶牛在熊大妈的带领下排成了一条直队。

显然,不同的奶牛身高不一定相同……

现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛 \(A\) 是最矮的,最右边的 \(B\) 是最高的,且 \(B\) 高于 \(A\) 奶牛。中间如果存在奶牛,则身高不能和 \(A,B\) 奶牛相同。问这样的奶牛最多会有多少头?

从左到右给出奶牛的身高,请告诉它们符合条件的最多的奶牛数(答案可能是 \(0,2\),但不会是 \(1\))。

输入格式

第一行一个正整数 \(N\),表示奶牛的头数。

接下来 \(N\) 行,每行一个正整数,从上到下表示从左到右奶牛的身高 \(h_i\)。

输出格式

一行一个整数,表示最多奶牛数。

样例 #1

样例输入 #1

5
1
2
3
4
1

样例输出 #1

4

提示

样例解释

取第 \(1\) 头到第 \(4\) 头奶牛,满足条件且为最多。

数据范围

对于全部的数据,满足 \(2 \le N \le 10^5\),\(1 \le h_i <2^{31}\)。

浅浅谈一下

记一个右端点 \(r\),假设我们维护了 \([1,r]\) 的后缀最大和最小值,这个区间之外的数我们不考虑

  • \(r\) 为区间最大值,则 \(l\) 必须要大于 \(r\) 的上一个后缀最大值
  • \(l\) 为区间最小值,那么 \(l\) 为这个前缀的最小值

记 \(r\) 的上一个后缀最大值为 \(p\),则要找 \(p\) 之后的后缀最小值(当然,越小越好)

二分即可

\(\mathcal{Code}\)

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

const int MAXN = 1e5 + 7;

int n, ans;
ll a[MAXN];
vector<int> maxx, minn;//后缀最小值和后缀最大值 


int main () {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	cin >> n;
	generate (a + 1, a + 1 + n, [](){ll x; cin >> x; return x;});

	maxx.push_back(0), minn.push_back(0);
	for (int r = 1; r <= n; r ++) {//枚举右端点
		while (!maxx.empty() && a[maxx.back()] <= a[r] && maxx.back() != 0) maxx.pop_back();
		while (!minn.empty() && a[minn.back()] >= a[r]) minn.pop_back();
		int l = upper_bound(minn.begin(), minn.end(), maxx.back()) - minn.begin();
		//不存在返回a.end() 
		if (l != minn.end() - minn.begin()) ans = max (ans, r - minn[l] + 1);
		maxx.push_back(r), minn.push_back(r);
	}
	cout << ans << endl;
	return 0; 
}

完结撒花✿✿ヽ(°▽°)ノ✿

标签:minn,后缀,题解,排队,back,int,最小值,奶牛
From: https://www.cnblogs.com/Phrvth/p/17289615.html

相关文章

  • AT CODE FESTIVAL 2016 Final J 题解
    题目妙妙题!简要题意:给定一个\(n\),有一个\(n\timesn\)的网格图。有\(4n\)个方向\(U/D/L/R_{1,2,\dots,n}\),如下图:对于每个方向,有个限制:数\(x\)。你可以进行\(\lex\)次推棋子,把一个棋子放到当前方向指向的第一格,然后如果原来第一格有棋子,把它放到第二格,如果原来第二......
  • 【问题解决】eclipse cdt debug状态控制台输出中文部分乱码
    问题复现使用eclipsecdt版本写了一个C代码简易输出的程序如下:#include<stdio.h>#include<stdlib.h>voidprintln(chararr[]){ inti=0; while(arr[i]!='\0'){ printf("%c",arr[i]); i++; } printf("\n");}intmain(void){......
  • FWT & FMT & 集合幂级数 题解集
    CF449DJzzhuandNumbers简要题意给定序列\(\{a_n\}\),求有多少个子序列满足所有元素的按位与为\(0\)。题解F1考虑FWT的与卷积形式,构造序列\(\{A_n\}\),使\(A_i=\displaystyle\sum_{j\&i=i}a_i\),记\(B_i=\displaystyle\sum_{b\ina}[(b_1\&b_2\&\cdots\&b_n)\&......
  • 2023GPLT选拔题解
    看到没有题解我就给大家浅浅的写一篇吧,如果有错误,希望大家可以帮我指出来哦,创作不易,如果大家给个关注,点个赞就更好了  1:著名开源操作系统Linux的核心创始人Linus有一句经典名言:”Talkischeap.Showmethecode.“ 说出这句话时是2000年8月25日,那天有人在Linus的Linu......
  • 查看hbase表没有,但是新建却显示存在这个表的问题解决方案
    转:https://blog.csdn.net/leng91060404/article/details/106956315zookeeper数据存储及查看hbase信息1.zookeeper数据存储:1.1内存数据存储、磁盘数据存储.    内存数据存储:    数据模型是一棵树。包括所有节点路径,节点信息,ACL等。    DataTree:所有节点信息  ......
  • 洛谷 P3377 【模板】左偏树(可并堆)题解 左偏树模板题
    题目链接:https://www.luogu.com.cn/problem/P3377维护左偏树的同时还需要维护一个并查集。但是并查集也就一个find操作。pop的时候更新f[x]的操作很神奇。示例程序:#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e5+5;intn,m,op,x,y,val[m......
  • 【ACM算法竞赛日常训练】DAY10题解与分析【月月给华华出题】【华华给月月出题】| 筛法
    DAY10共2题:月月给华华出题华华给月月出题难度较大。......
  • C++奥赛一本通贪心题解
    C++奥赛一本通刷题记录(贪心)2017.11.15Bygwj1139177410书不见了,占坑待填。AnEasyProblempoj2453//贪心,将最右边第一个01改成10并将其右边的1都往右移到最低位#include<iostream>usingnamespacestd;intmain(){unsignedintn,x;while(cin>>n&&n){......
  • SEO常见问题解答:如何解决网站优化中遇到的难题和挑战
    SEO常见问题解答:如何解决网站优化中遇到的难题和挑战网站优化是提高网站在搜索引擎中排名和流量的重要手段,但是在优化过程中,往往会遇到各种难题和挑战,如何有效地解决这些问题,是每个网站运营者和SEO专家都需要掌握的技能。本文将针对一些常见的网站优化问题,给出一些解决方案和建议......
  • HDU动态规划题解目录
    ProblemA:MaxSum(HDU1003)   点击这里ProblemB:CommonSubsequence(HDU1159)    点击这里ProblemC:SuperJumping!Jumping!Jumping!(HDU1087)    点击这里ProblemD:HumbleNumbers(HDU1058)   点击这里ProblemE:MonkeyandBanana(HDU1069)    点击这里ProblemF:......