首页 > 其他分享 >P10878 [JRKSJ R9] 在相思树下 III 题解

P10878 [JRKSJ R9] 在相思树下 III 题解

时间:2024-09-02 21:17:14浏览次数:10  
标签:1000010 P10878 int 题解 最大值 R9 最小值 序列 操作

Description

给定一个长为 \(n\) 的序列 \(a_{1\dots n}\),需要对它进行两种操作共 \(n-1\) 次。

对一个长度为 \(l\) 的序列 \(b_{1\dots l}\) 进行一次操作将会把序列变为一个长为 \(l-1\) 的序列 \(c_{1\dots l-1}\):

  • 操作一中,\(\forall i\in[1,l),c_i=\max(b_i,b_{i+1})\);
  • 操作二中,\(\forall i\in[1,l),c_i=\min(b_i,b_{i+1})\)。

给定整数 \(m\),你只能进行至多 \(m\) 次操作一。进行 \(n-1\) 次操作后序列 \(a\) 的长度变为 \(1\)。你可以任意安排操作的顺序,求最终剩余的数 \(a_1\) 的最大值。

Solution

比第一题简单。

两个关键性质就是操作一做满 \(m\) 次最优,且做完操作一再做操作二。

我们发现操作一每次一定会把当前最小值消去,使最大值数量变多,操作二一定会把当前最大值消去,使最小值数量变多。

先做操作一则能抬高数值下限,做满 \(m\) 次使最小值最大,最大值数量最多,此种决策最优。

而在一次操作一前做操作二,不仅会使最小值变多,还会降低数值上限,不优于上种决策。

确定了操作顺序后就完了吗?并不是,还需要找到最小值,而直接模拟是 \(O(n^2)\) 的。

发现在一次操作一后可能不止最小值会消去,如 \([1,3,2,3]\) 做一次操作一变成 \([3,3,3]\)。

又发现一个数会被左右两边第一个比它大的数 \(a_l,a_r\) 消去,会在 \(r-1-l\) 次操作一后消失。

然后在在所有不能在 \(m\) 次操作一之内消去的数中取最小值即可。

用单调栈找 \(a_l,a_r\) 可 \(O(n)\) 做完。

Code

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[1000010];
int l[1000010],r[1000010];
stack<int> s;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		while(s.size()&&a[s.top()]<=a[i]){
			s.pop();
		}
		l[i]=s.size()?s.top():0;
		s.push(i);
	}
	while(s.size()) s.pop();
	for(int i=n;i>=1;i--){
		while(s.size()&&a[s.top()]<=a[i]){
			s.pop();
		}
		r[i]=s.size()?s.top():n+1;
		s.push(i);
	}
	int minn=1e9;
	for(int i=1;i<=n;i++){
		if(r[i]-1-l[i]>m){
			minn=min(minn,a[i]);
		}
	}
	cout<<minn;
	return 0;
}

标签:1000010,P10878,int,题解,最大值,R9,最小值,序列,操作
From: https://www.cnblogs.com/larryyu/p/18393536

相关文章

  • Capital许可管理常见问题解答
    在软件资产管理过程中,企业经常会遇到各种关于许可管理的问题。这些问题不仅影响软件的合规使用,还可能导致不必要的法律风险和成本浪费。作为专业的软件许可管理解决方案提供商,Capital致力于帮助企业轻松应对这些挑战。以下是Capital许可管理中常见的问题及其解答,助您更好地理解和......
  • 【树莓派开发】树莓派GeanyIDE和控制台下C/C++中文乱码问题解决方法
    文章目录情况说明1.设置VS,将文件保存为UTF8编码2.更改GeanyIDE编码设置3.更改树莓派系统设置情况说明之前使用树莓派的时候,遇到了中文乱码的问题。VS2019编译器下写的.c文件,里面的中文注释在树莓派ide上乱码树莓派控制台上,C语言代码输出中文时乱码这里需要调整三个设置来解决该......
  • BUUCTF Reverse题解:第二部分(持续更新)
    Welcomeagain,toC12AK'sRejournal!目录题目传送门前言1.[GWCTF2019]pyre题目传送门前言就是不想上课……Re比上课有意思多了qwq1.[GWCTF2019]pyre下载的文件是.pyc格式,它是.py经编译后的字节码文件,可以使用在线工具进行反编译。我们把文件放入,得到如下代码......
  • BUUCTF Reverse题解:第一部分(已完结)
    WelcometoC12AK'sRejournal!目录题目传送门前言1.easyre2.reverse13.reverse24.内涵的软件5.新年快乐6.xor7.reverse38.helloworld9.不一样的flag10.SimpleRev11.luck_guy12.Java逆向解密13.JustRE14.刮开有奖15.简单注册器结语题目传送门前言现在是......
  • CF2008场题解
    Sakurako'sExam算法:模拟,分类讨论。题意简述:给\(a\)个数字\(1\)和\(b\)个数字\(2\),问能否在每个数字前加上加减号使得原始值为\(0\)。考虑\(1\)的个数如果是奇数,那么一定不行。否则如果\(2\)的个数是偶数,一定可以。当\(2\)的个数为奇数且还可能可以时,判断是否存......
  • ABC369F F - Gather Coins 题解
    题目链接:https://atcoder.jp/contests/abc369/tasks/abc369_f题目大意:在一个\(H\timesW\)的二维迷宫中有\(N\)枚硬币,其中第\(i\)枚硬币在\((R_i,C_i)\)(本题中,我们用\((r,c)\)表示二维迷宫中从上到下第\(r\)行从左到右第\(c\)列的那个格子)。你一开始在迷宫的左......
  • 如何解决《罗马2全面战争》中的twitchsdk_32_release.dll错误模块跳出问题?实用技巧与
    当您启动《罗马2全面战争》时,可能会遇到与twitchsdk_32_release.dll相关的错误提示,这可能导致游戏无法正常运行。本篇文章将深入探讨这一问题的原因以及提供多种解决方法,帮助您顺利启动游戏。twitchsdk_32_release.dll错误模块跳出的原因twitchsdk_32_release.dll文件出现......
  • VirtualSurveyor9.2.0 无人机摄影测量数据处理软件
    VirtualSurveyor9.2中文版是功能强大的无人机测绘软件,使用旨在为用户提供完整的地理空间数据可视化和分析功能,带来提高的生产力,功能全面而强大,在无人机到CAD模型的过程中,使用VirtualSurveyor软件来拆卸输送机、测量体积并绘制断裂线!从您的无人机数据高效地创建调查,创建测量,表......
  • 【题解】Solution Set - 「蓝」题板刷
    【题解】SolutionSet-「蓝」题板刷始于:2024/9/1(其实之前大概做了十来道,但是没有记录。估计题会比较多,如果从代码里面过来的话,建议直接Ctrl/⌘+F题目名称。「USACO18JAN」MooTubeG2024/9/1一句话题意:https://www.luogu.com/discuss/125319给定一棵有边权的树,每次询......
  • 题解:AT_abc257_d [ABC257D] Jumping Takahashi 2
    [ABC257D]JumpingTakahashi2博客食用更佳:Myblog。大体思路这题是一道二分题,因为\(S\)越大,就越容易满足题目要求,\(S\)越小,就越难满足题目要求,符合二分的特点。下面先贴上二分代码。LLl=0,r=1e10;while(l<r){intmid=l+r>>1;if(check(mid))......