news 2026/8/20 2:17:47

第八届传智杯 初赛 bxg25-4 锁 题解 暴力模拟 + 直接维护区间计数 桶思想 简单直观易懂

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第八届传智杯 初赛 bxg25-4 锁 题解 暴力模拟 + 直接维护区间计数 桶思想 简单直观易懂

描述

已知牛牛有 nn 份资源,编号为 11 到 nn,初始均处于未上锁状态。现在共有 mm 次操作,每次给定一个编号 pp:
∙ ∙若编号为 pp 的资源未上锁,则为其上锁;
∙ ∙否则,解除锁,使其回到未上锁状态。
每次操作后,牛牛希望分别统计区间 [1,x][1,x] 与 [y,n][y,n] 中“可访问”资源的数量。这里规定,资源可访问当且仅当其处于未上锁状态。

输入描述:

每个测试文件均包含多组测试数据。第一行输入一个整数 T(1≦T≦103)T(1≦T≦103) 代表数据组数,每组测试数据描述如下:
第一行输入四个整数,依次为:
∙ ∙n(1≦n≦2×105)n(1≦n≦2×105),表示资源数量;
∙ ∙m(1≦m≦4×105)m(1≦m≦4×105),表示操作次数;
∙ ∙x(1≦x≦n)x(1≦x≦n),表示区间 [1,x][1,x] 的右端点;
∙ ∙y(1≦y≦n)y(1≦y≦n),表示区间 [y,n][y,n] 的左端点。
此后 mm 行,第 ii 行输入一个整数 pi(1≦pi≦n)pi​(1≦pi​≦n),表示对编号为 pipi​ 的资源切换锁状态。

输出描述:

对于每次操作,新起一行输出两个整数,分别表示区间 [1,x][1,x] 与 [y,n][y,n] 中可访问资源的数量。

示例1

输入:

2 4 3 2 3 2 3 3 6 6 4 2 1 3 6 4 4 2

复制输出:

1 2 1 1 1 2 3 5 2 4 2 3 1 2 2 3 1 2

说明

对于第一组测试数据,用 yy 表示资源上锁,nn 表示资源未上锁,过程如下: ∙ ∙第一次操作后,资源上锁情况为:n,y,n,nn,y,n,n,可以发现,区间 [1,2][1,2] 中只有编号 11 可访问,而区间 [3,4][3,4] 均未上锁,所以输出 11 和 22; ∙ ∙第二次操作后,资源上锁情况为:n,y,y,nn,y,y,n,可以发现,区间 [1,2][1,2] 情况不变,区间 [3,4][3,4] 中只剩下编号 44 可访问,所以输出 11 和 11; ∙ ∙第三次操作,将资源 33 解锁,重新回到了第一次操作后的状态,因此,输出与第一次操作后的输出相同,输出 11 和 22。

思路:

主播看到题没想那么多,看到数据范围,直接无脑想用桶或者布尔计数来标记每个锁的状态,这样无脑的做法来做,过了,不过数据再大的就肯定过不了的,正解应该是树状数组 / 线段树 + 前缀和思想来高效维护区间统计。简单来说,就是用bool数组记录每个数的标记状态,每次切换状态后,只更新该数所在区间的计数,最后实时输出结果,核心是 “按需更新、即时输出” 的模拟思想。

主播的代码:

#include <iostream> #include<queue> #include<cstring> #include<algorithm> #include<cstdio> #include<map> #include<vector> #include<set> #include<stack> #include<string> #include<math.h> #include <iomanip> #include<unordered_map> #include <unordered_set> #include<array> #define gets(S) fgets(S,sizeof(S),stdin) #define ll long long const ll N = 5e5 + 5; const ll Max = 0x3f3f3f3f; using namespace std; ll t; bool saki[N]; int main() { cin >> t; ll n, m, x, y; while (t--) { cin >> n >> m >> x >> y; ll w, ansx = x, ansy = n - y + 1; for (int i = 1; i <= m; i++) { cin >> w; if (!saki[w]) { saki[w] = 1; } else { saki[w] = 0; } if (w >= y) { if (saki[w]) { ansy -= 1; } else { ansy += 1; } } if (w <= x) { if (saki[w]) { ansx -= 1; } else { ansx += 1; } } cout << ansx << ' ' << ansy << endl; } for (int i = 1; i <= m; i++) { saki[i] = 0; } } return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/19 22:02:18

Video Download Helper 高级版终极指南:完全解锁无限制下载功能

还在为在线视频下载时间限制而烦恼吗&#xff1f;现在&#xff0c;通过这款强大的视频下载插件&#xff0c;您可以彻底告别120分钟的限制&#xff0c;实现真正的无限制下载体验&#xff01;本指南将为您详细介绍如何安装和使用这款功能强大的Chrome扩展。 【免费下载链接】Vide…

作者头像 李华
网站建设 2026/8/19 19:57:34

哔哩下载姬DownKyi:高效管理B站视频资源的完整教程

哔哩下载姬DownKyi&#xff1a;高效管理B站视频资源的完整教程 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xff…

作者头像 李华
网站建设 2026/8/20 16:35:47

进程间通信--共享内存

共享内存的基本原理1. 核心步骤要在 Linux 中使用 System V 共享内存&#xff0c;通常遵循以下“四步走”&#xff1a;创建/获取 (Create/Get)&#xff1a;向内核申请一块共享内存&#xff0c;就像 malloc 一样&#xff0c;但这是内核管理的。系统调用&#xff1a;shmget关联 (…

作者头像 李华
网站建设 2026/8/18 18:08:01

17、OS X 系统中的多任务处理与进程管理

OS X 系统中的多任务处理与进程管理 1. 多任务处理概述 OS X 具备强大的多任务处理能力,它能迅速地在运行的应用程序和系统进程之间分配处理器时间,让用户感觉所有任务都在同时运行。当新应用启动、进程开始,或者其他进程闲置或完全关闭时,系统会实时监控这些任务,并动态…

作者头像 李华
网站建设 2026/8/20 6:03:51

从零构建多语言AI应用:Klavis国际化实战指南 [特殊字符]

面对全球化用户群体时&#xff0c;AI应用常常遭遇语言障碍、文化差异和区域适配等挑战。Klavis开源MCP基础设施为您提供了完整的解决方案&#xff0c;让您的AI应用轻松跨越语言边界&#xff0c;服务全球用户。 【免费下载链接】klavis Klavis AI (YC X25): Open Source MCP Inf…

作者头像 李华
网站建设 2026/8/18 18:40:59

Easy Effects社区预设使用指南:3步解锁专业级音效体验

Easy Effects社区预设使用指南&#xff1a;3步解锁专业级音效体验 【免费下载链接】easyeffects Limiter, compressor, convolver, equalizer and auto volume and many other plugins for PipeWire applications 项目地址: https://gitcode.com/gh_mirrors/ea/easyeffects …

作者头像 李华