P7912 [CSP-J 2021] 小熊的果篮

news/2025/11/12 19:07:35/文章来源:https://www.cnblogs.com/qwqSW/p/19214992

题目传送门

欢迎来到我的博客

闲话:被 set 薄纱了,以后该好好练练 set 了QAQ


模拟好题。本题做法很多,这里介绍的是这篇题解的做法。

我们将所有 0 出现的下标扔进一个堆,将所有 1 出现的下标扔进另一个堆。

比如这个样例 1,我们扔完后就是这样的:

0 : 3 4 8 11 12
1 : 1 2 5 6 7 9 10

这样的话我们发现,因为我们要分别取到每个块的开头,所以这个开头颜色一定是 01 交替的,并且每次都要取当前比上一个数大的下标最小值。(这个应该很好理解)

至于第一个取出来的数字的颜色,我们当然要取当前还在堆里的最小下标。

如果一个水果被取出来了,我们在对应的堆里面执行 \(erase\) 操作即可。

比如样例 1 里面,第一轮取水果时,先取下标最小的 1,然后再去另一个堆里面取下标大于 1 的最小数,也就是 3,然后再回到 1 堆,取数字 5(因为下标要大于 3)……以此类推,最终第一轮取出来的数就是:

 1 3 5 8 9 11

怎么说呢,有点类似于两个人打扑克,双方都想尽量往外出牌,所以扔单牌的时候都尽量要选更小的牌。(当然,这张牌的大小要大于上一张牌)

这样做最大的好处在于,我们不用额外考虑两堆水果合并的问题了。比如样例 1 里把 8 取走后,就相当于将 9 跟前面合并了。

画个图感性理解一下:

P7912_1_2

P7912_2_1

我们发现,粉色块还在的时候,我们拿走粉色块里的东西时,下一个下标大于粉块的就是蓝块。

但是当粉色块消失了,那么上一个 0 跳到黑色块后,就会跳到蓝块后的 0 上,而原先蓝色块里的东西就必须要在黑色块消失后才能拿走。起的效果就是蓝色块约等于合并在黑色块后面了。

P7912_3_1

这样就不用额外合并块了。美滋滋。

而当最后只剩一个颜色了,那我们直接让它一个个出去就好了。时间复杂度 \(O(n \log n)\)

代码实现非常易懂。

P7912
#include<bits/stdc++.h>
#define int long long
using namespace std;inline int read(){int x=0,f=1;char c=getchar();while(c<48){if(c=='-') f=-1;c=getchar();}while(c>47) x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}const int N=2e5+5;
const int inf=1e16;
const int BIR=20091124;
int n,a[N];
set<int> q[2];signed main(){n=read();for(int i=1;i<=n;i++){a[i]=read();q[a[i]].insert(i);}//额外扔一个大数进去是为了防止upper_bound越界导致奇怪错误 q[0].insert(BIR),q[1].insert(BIR);int cur=0;while(!q[0].empty()&&!q[1].empty()){int mn=min(*q[0].begin(),*q[1].begin());if(mn==BIR) break;//找到最后了,该开下一个篮子了 printf("%lld ",mn);if(*q[0].begin()==mn){cur=1,q[0].erase(mn);} else{cur=0,q[1].erase(mn);} while(!q[cur].empty()){mn=*q[cur].upper_bound(mn);//找到最后了,该开下一个篮子了 if(mn==BIR) break;printf("%lld ",mn);q[cur].erase(mn);cur^=1;}printf("\n");}//剩的一块数一个个输出 while(!q[0].empty()&&*q[0].begin()!=BIR){printf("%lld\n",*q[0].begin());q[0].erase(*q[0].begin());}while(!q[1].empty()&&*q[1].begin()!=BIR){printf("%lld\n",*q[1].begin());q[1].erase(*q[1].begin());}
//	其实没必要存一下再输出的。。。直接输出就好return 0;
}

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

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

相关文章

完整教程:对于环形链表、环形链表 II、随机链表的复制题目的解析

完整教程:对于环形链表、环形链表 II、随机链表的复制题目的解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

银河麒麟高级服务器操作系统V10SP3(X86)【在使用Xshell通过SSH连接时遇到 “服务器发送了一个意外的数据包。receives:3,expected:20”错误】问题解决方法

【问题描述】在使用Xshell通过SSH连接银河麒麟高级服务器操作系统V10SP3时,出现如下报错:服务器发送了一个意外的数据包。receives:3,expected:20【问题分析过程】1.检查服务器上的防火墙(firewalld)是否阻止了SSH…

数据结构与算法:动态规划的深度探讨 - 指南

数据结构与算法:动态规划的深度探讨 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &quo…

第六章蓝墨云班习题

import os, pythoncom, win32com.client as win32# ---------------------- 工具函数 ---------------------- def get_or_add_style(doc, name):try:return doc.Styles(name)except:return doc.Styles.Add(Name=name,…

[network] IPv4 vs. IPv6 address pool

=============== let’s expand on that precisely.1. IPv4 address space size Each IPv4 address is 32 bits long. Therefore, the total number of possible combinations is: [ 2^{32} = 4,294,967,296 ] That’s…

详细介绍:微信小程序开发实战指南(三)-- Webview访问总结

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

[Network] subnet mask

Q: ip address: 192.168.1.100subnet mask 255.255.255.0why is 192.168.x.x so special?what does this subnet mask mean? 192 in binary form is 11000000168 in binary form is 10101000why these two number ar…

flask: 用flask-cors解决跨域问题

一,安装第三方库 $ pip install flask-cors 二,代码: from flask_cors import CORSapp = Flask(__name__)# 解决存在跨域的问题 CORS(app)

Linux小课堂: 用户管理与权限控制机制详解 - 实践

Linux小课堂: 用户管理与权限控制机制详解 - 实践2025-11-12 18:36 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displa…

linux版本微信打开关闭快捷键

安装相关依赖: sudo apt install libx11-dev libdbus-1-dev wmctrl 复制源代码,编译: g++ -std=c++11 -o wechat wechat.cpp deepin系统设置全局快捷键源码: //g++ -std=c++11 -o wechat wechat.cpp //这是一个通过…

如何在 .NET 中使用 SIMD

目录什么是 SIMDSIMD 基础 APISystem.Runtime.Intrinsics 命名空间如何理解向量的大小跨平台实现方式SIMD 指令集的使用System.Numerics 命名空间中的 SIMD 支持Vector<T> 结构体Vector2、Vector3 和 Vector4 结…

Linux shell映射表(变量的变量)

前言全局说明一、说明 1.1 环境: Ubuntu 22.04二、映射表 declare -A ARCH_MAP=(["arm"]="arm-linux-gnueabihf"["aarch64"]="aarch64-linux-gnu"["mips"]="m…

前端 GIT 使用技巧

Hello World本文来自博客园,作者:南宫影,转载请注明原文链接:https://www.cnblogs.com/nangongying/p/19214917

详细介绍:显卡算力过高导致PyTorch不兼容的救赎指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025/11/13

2025/11/13循环不变量原则: 循环不变量原则是算法设计与证明中用于确保循环逻辑正确性的核心思想,指在循环执行的每一轮前后,都保持一个固定的、为真的命题(不变量)。 这个命题明确了循环变量、数据结构或窗口的核…

Linux《网络基础》 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

《程序员修炼之道》阅读笔记4

按合约设计 按合约设计(Design by Contract,DBC)是一种基于合约的软件开发方法,它借鉴了现实世界中合约的概念,明确模块之间的权利与责任。在软件系统中,每个函数或方法都有其特定的职责,DBC通过定义前条件、后…

记一次 .NET 某医联体管理系统 崩溃分析

一:背景 1. 讲故事 这段时间都在跑外卖,感觉好久都没写文章了,今天继续给大家带来一篇崩溃类的生产事故,这是微信上有位老朋友找到我的,让我帮忙看下为啥崩溃了,dump也在手,接下来就可以一顿分析。 二:崩溃分析…

如何构建可信智能 Data Agent?推荐 Aloudata Agent 分析决策智能体

企业构建可信智能的 Data Agent 需以强大的数据底座为支撑,统一指标语义层和 NoETL 数据工程成为关键摘要: 在 AI 与大数据深度融合的当下,数据分析民主化日渐火热。Aloudata Agent 分析决策智能体依托于统一的指标…

Java 集合-Set

Java 集合 - Set 详解 集合(Set)是用于存储和处理无重复元素的高效数据结构,映射表(Map)则类似目录,支持通过键值快速查询和获取对应值。例如检验某人是否在论文答辩名单中,用 Set 实现比线性表更高效;若需存储…