【CSP-J 2021】 小熊的果篮

【CSP-J 2021】 小熊的果篮 解题报告

1 题目链接

洛谷P7912

2 题目大意

题目名称:小熊的果篮
题目大意:

(这…)
小熊的水果店里摆放着一排 n n n 个水果。每个水果只可能是苹果或桔子,从左到右依次用正整数 1 , 2 , … , n 1, 2, \ldots, n 1,2,,n 编号。连续排在一起的同一种水果称为一个“块”。小熊要把这一排水果挑到若干个果篮里,具体方法是:每次都把每一个“块”中最左边的水果同时挑出,组成一个果篮。重复这一操作,直至水果用完。注意,每次挑完一个果篮后,“块”可能会发生变化。比如两个苹果“块”之间的唯一桔子被挑走后,两个苹果“块”就变成了一个“块”。请帮小熊计算每个果篮里包含的水果。
题目大意:简称题目本身
这除了原文谁说得清啊喂。

3 解法分析

正解似乎有相当多种做法,例如: O ( n n ) O(n\sqrt{n}) O(nn ) O ( n ) O(n) O(n) O ( n log ⁡ n ) O(n\log n) O(nlogn)等等。
线段树和珂朵莉树过分了啊
显然一眼丁真,链表。然鹅…
《你没 30 m i n 30min 30min调不出来系列》
模拟赛就写这东西写挂了(打死我也不会说我最后输出 1 1 1 n n n水到了 10 10 10分)。
这里说一个 O ( n log ⁡ n ) O(n\log n) O(nlogn) 500 b y t e 500byte 500byte蒟蒻专属做法罢。

(以上是废话)
首先,要知道set这个奆容器。
与链表不同,我们可以开两个set分别用于存放01的下标
显然,对于每一行输出,我们只需在两个set旋转跳跃即可。
为了方便模拟,我们想到了异或运算,也就是^。对于一个01,只需a ^ 1即可转换。
因此,set开成set <int> st[2]会节约许多转换过程
那么,这道题基本思路已经梳理完了。
细节见代码。

4 AC Code

#include <bits/stdc++.h>
#define N 200007
using namespace std;

int n, a[N];
set <int> st[2];//细节减码量

int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &a[i]),
		st[a[i]].insert(i);//每一个都压入set
	}
	st[0].insert(1e9);//以判断当前是否已经遍历完
	st[1].insert(1e9);//同上
	while (*st[0].begin() != 1e9 || *st[1].begin() != 1e9/*0与1都没有遍历完*/) {
		for (int i = min(*st[0].begin(), *st[1].begin());//初始化为两边最小,即为开头
				i != 1e9; i = *st[a[i] ^ 1].lower_bound(i)) {//不断二分更新
			printf("%d ", i);//直接输出
			st[a[i]].erase(i);//细节删除
		}
		puts("");//细节换行
	}
	return 0;
}//蒟蒻的奇妙码风

5 瞎说

建议各位有机会的话写一写链表。
真锻炼模拟能力

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,CSP-J2021复赛有两道题目,分别是分糖果和小熊果篮。 对于第一题分糖果,题目来源是CCF,难度为入门。根据给出的代码,这是一个基于循环的算法,通过遍历[l,r]区间内的数,计算数对n取模后的最大值。具体的实现细节可以参考引用中的代码。这道题目属于入门级别,比较简单。 第二题是关于小熊果篮。给定一个长度为n的数组a,其中连续的相同元素被视为一个块,要求按照块的顺序输出每个块的头元素,并删除已输出的元素。具体的实现细节可以参考引用中的代码。这道题目需要使用双链表来处理,时间复杂度为O(n)。 综上所述,CSP-J2021复赛的题目包括分糖果和小熊果篮,具体的解题思路和代码实现可以参考上述引用内容。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [[CSP-J 2021]比赛题解](https://blog.csdn.net/weixin_56550385/article/details/126811201)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [新鲜出炉的 CSP-J 2021 复赛题目 题解](https://blog.csdn.net/qq_23109971/article/details/121024436)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值