Codeforces 1066C Books Queries

本文介绍了一种书架模拟算法的优化方法,通过使用双向队列进行前插和后插操作,解决书本放置和查询问题。初始方案因查询效率低而超时,后续采用数组记录书本位置并维护边界,实现O(1)时间复杂度的单点查询。文章详细讨论了算法细节,如唯一ID处理和初始化书籍等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模拟题。

有一个书架,你可以在书架上放书,下面有三种操作类型:

(1) L id 在书架的左边插入一本下标为id的书

(2) R id 在书架的右边插入一本下标为id的书

(3) ? id 从最左边或者最右边连续拿走几本书,使得下标为id的书变成书架上最左边的书或者最右边的数,求最少需要拿走几本书。

一开始我直接按照纯模拟去做的,用双向队列,可以前插和后插,但是超时了,因为每做一次查询几乎就是线性的时间。

后来发现可以用一个数组记录每个id的位置,再维护一下最左边和最右边的位置就行了,这样单点查询可以做到O(1).

还有一些细节就不再赘述了,比如每个id都是唯一的,最一开始的书怎么处理等等。

#define  _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <algorithm>
#include <deque>
#include <iostream>
#include <string>

using namespace std;

int q;
char c;
int id;
int temp[2 * 100000 + 5];

int main() {
	scanf("%d", &q);
	getchar();
	int l = 100000;
	int r = 100001;
	while (q--) {
		scanf("%c %d", &c, &id);
		getchar();
		if (c == 'L') {
			temp[id] = l--;	
		}
		else if (c == 'R') {
			temp[id] = r++;
		}
		else {
			printf("%d\n", min(temp[id] - l - 1, r - temp[id] - 1));
		}
	}
	//system("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值