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

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

时间:2024-09-01 08:54:19浏览次数:10  
标签:P10878 洛谷 int 题解 更新 最小值 操作 include

原题链接

解析

在操作一时,最小值如果在最后一位,其无法更新任何数,会被删除;否则不在最后一位时一定会被其右侧更大的数更新。所以在操作一时,最小值一定会被更新掉。

同理,在操作二时,最大值一定会被更新掉。

由此,操作一决定了答案的下限,操作二决定了答案的上限。

所以可以得出贪心策略:先进行 \(m\) 次操作一,后进行 \(n-m-1\) 次操作二

进行完操作一以后,很明显如果只进行操作二,那么最后剩下的一定是剩下数的最小值。

\(m\) 次操作一的时间复杂度为 \(O(NM)\),可以得 \(40\) 分,但操作一的过程还可以优化。

因为 \(m\) 次操作一可以使 \(a_i\) 影响到 \(a_{i-1},a_{i-2},\cdots,a_{i-m}\),所以反过来,\(a_i\) 在经过 \(m\) 次操作一以后被 \(a_{i+1},a_{i+2},\cdots,a_{i+m}\) 影响,\(a_i\) 即为 \(\max\{a_j\}\),其中 \(j \in [i+1,i+m]\)。

问题转化成了“对于每个数,求它右边 \(m\) 个数的最大值”,可以用优先队列维护。

代码:

40 Pts 代码

#include<cstdio>
#include<algorithm>
using namespace std;

const int N=1e6+5;
int n,m,a[N];

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=n-i;j++)
			a[j]=max(a[j],a[j+1]);
	}
	int ans=0x3f3f3f3f;
	for(int i=1;i<=n-m;i++)
		ans=min(ans,a[i]);
	printf("%d\n",ans);
	return 0;
}

100Pts 代码

#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;

const int N=1e6+5;
int n,m,a[N],b[N];
deque<int> q;

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)
	{
		if(!q.empty() && i-q.front()>m) q.pop_front();
		while(!q.empty() && a[q.back()]<a[i]) q.pop_back();
		q.push_back(i);
		if(i>=m+1) b[i-m]=a[q.front()];
	}
	int ans=0x3f3f3f3f;
	for(int i=1;i<=n-m;i++)
		ans=min(ans,b[i]);
	printf("%d\n",ans);
	return 0;
}

标签:P10878,洛谷,int,题解,更新,最小值,操作,include
From: https://www.cnblogs.com/jerrycyx/p/18391003

相关文章

  • LOJ #6089. 小 Y 的背包计数问题 题解
    Description小Y有一个大小为\(n\)的背包,并且小Y有\(n\)种物品。对于第\(i\)种物品,共有\(i\)个可以使用,并且对于每一个\(i\)物品,体积均为\(i\)。求小Y把该背包装满的方案数为多少,答案对于\(23333333\)取模。定义两种不同的方案为:当且仅当至少存在一种物品的......
  • 学校训练赛的一些题解
    第二十一届宁波大学程序设计竞赛(重现赛链接)C游戏开发部的小游戏(C)赛时并没有写出来,果然dp还得多练)将所有石头视为容量为\(n\)的背包,每堆石头的数量即背包中物品的质量,对于\(a_i\leqf_i\leqb_i\),由于\(f_i\)最终取值唯一,可当作分组背包处理。将大小为\(i\)的\(t\)......
  • 洛谷 P11012 颜料
    洛谷P11012颜料题意给出长度为\(n\)的序列\(a\)。定义一段区间\([l,r]\)的绚丽程度\(X_{l,r}\)为\(\sum_{i=1}^{W}\sum_{j=i+1}^W\min(c_i,c_j)\),其中\(W\)是值域,\(c_i\)表示\(a\)序列\([l,r]\)中\(i\)出现的次数,求绚丽程度至少为\(k\)的区间长度最小值。......
  • 洛谷 P11011 点的覆盖
    洛谷P11011点的覆盖题意给定一个四边平行于坐标轴的矩形\(A\),给定\(n\)个在矩形\(A\)内部(可能在边缘上)的点。求有多少个\(A\)的子矩形覆盖了所有\(n\)个点(允许在边缘上)。所有坐标都是整数。思路求出:\(X_1=\max_{i=1}^nx_i\),\(X_2=\min_{i=1}^nx_i\),\(Y_1=\max_......
  • CCF-CSP 2024 --重塑矩阵1,2c语言题解
     创作想法是因为像我当初大一时候想参加一些比赛但是奈何只学了c和c相关数据结构,但是对于许多竞赛的题目的题解往往都是c++或者其他面向对象的编程语言,让我们难以在c语言基础上入手这些比较复杂的题目。 创造的目的是为了帮助各位同时提高我对c语言编程的理解和锻炼个人......
  • CSP-J 2020 初赛试题解析(第一部分:单项选择题(5-10))
    ......
  • 【秋招笔试】8.30饿了么秋招(算法岗)-三语言题解
    ......
  • Leetcode 第 408 场周赛题解
    Leetcode第408场周赛题解Leetcode第408场周赛题解题目1:3232.判断是否可以赢得数字游戏思路代码复杂度分析题目2:3233.统计不是特殊数字的数字数量思路代码复杂度分析题目3:3234.统计1显著的字符串的数量思路代码复杂度分析题目4:3235.判断矩形的两个角落是否......
  • 【C语言进阶】C语言指针进阶实战:优化与难题解析
    ......
  • 【题解】拆分
    题目描述【题目描述】鸡尾酒又带着大家学习新定义啦!今天要学习的内容是集合的mex,集合的mex指的是一个集合没有出现过的最小自然数。例如,mex({1,2})=0、mex({0,1,2,3})=4。现在你有一个包含n个元素的集合,你可以将它分成任意个数量的新集合,使得所有新集合......