做题随笔:P10465

news/2025/1/13 22:36:28/文章来源:https://www.cnblogs.com/Tenil/p/18669559

Solution

这里是博客:Tenil,刚刚用上了 JS,不妨看看?

题意

原题链接

给定数列 \(a_N\),按以下要求分为 \(n\) 组:

  1. 每组中的数单调不降。
  2. 每组中的数在原数列中的下标单调递减/单调递增/先递减再递增。(思考一下双向队列插入值的过程显然有:越往两端的越后入队)
  3. 存在一种方法,使所有分组拼接后整体单调不降。

求最小的 \(n\)

分析

题目要求最终序列不降,所以断不可以按照输入顺序处理(所以 Sherry 才觉得棘手呢)。为什么呢?考虑一下样例:

3 6 0 9 6 3

如果直接按照输入顺序接,显然可以有分组方法: \([0,3,6,9],[3,6]\),不满足要求 \(3\)。其实就是在不知道所有数的情况下,可能把 \(l,r,mid(l < mid < r)\)\(l,r\)\(mid\) 分在了两组,导致无解。

为了避免无解的情况,一个很明显的策略是把所有数读入不降序排序后再处理,于是要求 \(1\)\(3\) 容易满足,接下来问题就在要求 \(2\):为了满足下标的要求,在排序时记录下标,按排序后的顺序逐位验证要求 \(2\),不满足则 \(n\gets n+1\) 即可,数据处理流程如下:

3 6 0 9 6 3\\初始数据
0 3 3 6 6 9\\排序后
3 1 6 2 5 4\\下标,验证此数组计数

还需注意两个小问题:

  1. 初始按照什么单调性来?

    一个完整的队列应是先递增再递减的,所以初始状态应为递减。

  2. 相等的数怎么处理?

    相等的数是完全初下标外等价的,相当于可以任意交换,而且一定要放在一组(不然无解或可能不是最小),故相等的数下标自身须有序,即相等的数放在一起,排序后考虑。而内部有序,其实最终只需考虑端点值即可。

3 [1 6] [2 5] 4\\相等的数一起考虑

实现

全部读入,记录下标后升序排序,全部扫一遍,相等的放一起记录端点值,转化为拼接区间。变量记录当前单调性,拼接时:还满足则继续,不满足则反转单调性,当转为递减时队列数增加一。

Code

#include <iostream>
#include <cstdio>
#include <cctype>
#include <algorithm>using namespace std;typedef long long ll;inline ll fr() {ll x=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-') f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+(c^48);c=getchar();}return x*f;
}const int maxn=2e5+1000;struct node {ll x,tag;
}num[maxn];
struct intva{ll l=1145141919,r=-1145141919;//这个初始值还没炸过(笑)
}qu[maxn];
ll n,ans=1;
bool down=true;inline bool cmp1(node n1,node n2) {return n1.x<n2.x;}int main() {n=fr();for(register int i = 1; i <= n; i++) {num[i].x=fr();num[i].tag=i;}sort(num+1,num+1+n,cmp1);ll now=num[1].x,cnt=1;//记得初始化qu[1].l=num[1].tag;qu[1].r=num[1].tag;for(register int i = 2; i <= n; i++) {if(num[i].x!=now) {now=num[i].x;cnt++;i--;//就是换一个区间重新来}else {qu[cnt].l=min(qu[cnt].l,num[i].tag);qu[cnt].r=max(qu[cnt].r,num[i].tag);}}for(register int i = 2; i<= cnt; i++) {if(down) {if(qu[i-1].l<qu[i].r) {down=false;}}else {if(qu[i-1].r>qu[i].l) {down=true;ans++;}}}printf("%lld\n",ans);return 0;
}

后话

感觉有用,还请点个赞吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/868743.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

股票异动拉升中间过程状态分析和检测算法

一.股票异动拉升中间过程状态分析和检测算法将股票分为:空闲,开始,持续,快停,涨停五种状态:可以勾选的方式来筛选处于五种状态的股票,更加精准的找出开始拉升,持续拉升,快要涨停的股票,对于处于空闲状态或者已经涨停的股票可以先不关注。 添加图片注释,不超过 140 …

一篇文章搞懂unity编辑器中Event的rawType, type和GetTypeForControl

简介 Event.rawType就是初始的type,可以通过Event.Use()将rawType修改为EventType.Used。 Event.type是经过GUIClip过滤的rawType,如果事件触发时,鼠标位置位于当前GUIClip中,返回rawType,如果鼠标不在当前GUIClip中,则设置为EventType.Ignore Event.GetTypeForControl 相…

我反向操作鸽掉腾讯音乐,只因为觉的...

大家好,我是土哥。 之前有位同学,在土哥的辅导下,居然飘了,当腾讯酷我音乐 HR 看完他的简历后,想邀约他面试,他直接一口回绝了。给的理由如下:目前只想面腾讯 QQ 音乐或者腾讯内部的岗位大厂流程已经到 offer 审核阶段了基于上述两个条件,所以暂时放弃面试。 当土哥看到…

leetcode刷题记录(java)——参考代码随想录:数组 链表 哈希表

四、题目之:代码随想录 https://programmercarl.com/ (1) 代码随想录:数组 704. 二分查找 class Solution {public int search(int[] nums, int target) {if(target<nums[0] || target>nums[nums.length-1]){return -1;}int left = 0,right = nums.length-1;while(lef…

本以为PDD挂了,结果开了50万SSP

大家好,我是土哥。 2024 届校招已然落下帷幕,互联网大厂为将优秀人才招致麾下,纷纷使出浑身解数。在薪资待遇方面,更是各有千秋 。 这里给大家分享一位2024届求职的小伙伴,PDD 非技术岗拿到 50w 的 SSP offer~ 我盆友圈的一个粉丝,之前和土哥交流,说她投递的PDD 上海岗位…

Win32汇编学习笔记11.游戏辅助的实现

Win32汇编学习笔记11.游戏辅助的实现-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net 游戏基址 游戏基址的概念游戏基址是保持恒定的两部分内存地址的一部分并提供一个基准点,从这里可以计算一个字节数据的位置。基址伴随着一个加到基上的偏移值来确定信息准…

黑狂野大数据2

--拉链表 --增量导入是没有overwrite 且加载的是最新分区的数据

others_shellcode 1

其实这题直接nc连一下就可以了。其实考的是系统调用来着 32位程序系统调用号用 eax 储存, 第一 、 二 、 三参数分别在 ebx 、ecx 、edx中储存。 可以用 int 80 汇编指令调用。 64位程序系统调用号用 rax 储存, 第一 、 二 、 三参数分别在 rdi 、rsi 、rdx中储存。 可以用 sys…

一篇解决编译原理大作业,基于Flex、Bison设计编译器(含语法分析树和符号表)

1.工具简单介绍 Flex 和 Bison 是编译器开发中常用的两个工具,分别用于生成词法分析器和语法分析器。它们通常一起使用,共同完成源代码的词法分析和语法分析工作。 Flex: Flex通过读取一个规则文件(通常是.l文件),这个文件中定义了一系列的模式和对应的动作。模式用于匹配…

python 删除txt的前三行并保存原文件

数据 #!usr/bin/env python # -*- coding:utf-8 _*- """@author:Suyue @file:raindrop.py @time:2025/01/$ {DAY} @desc: """ def remove_first_three_lines(file_path):# 读取原始文件的所有行with open(file_path, r, encoding=utf-8) as file…

P3586 [POI2015] Logistyka

P3586 [POI2015] Logistyka 题目描述 维护一个长度为 \(n\) 的序列,一开始都是 \(0\),支持以下两种操作:U k a 将序列中第 \(k\) 个数修改为 \(a\)。 Z c s 在这个序列上,每次选出 \(c\) 个正数,并将它们都减去 \(1\),询问能否进行 \(s\) 次操作。每次询问独立,即每次询…