news 2026/7/5 10:50:07

打卡信奥刷题(2789)用C++实现信奥题 P3939 数颜色

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
打卡信奥刷题(2789)用C++实现信奥题 P3939 数颜色

P3939 数颜色

题目背景

大样例可在页面底部「附件」中下载。

题目描述

小 C 的兔子不是雪白的,而是五彩缤纷的。每只兔子都有一种颜色,不同的兔子可能有相同的颜色。小 C 把她标号从 1 到n nnn nn只兔子排成长长的一排,来给他们喂胡萝卜吃。排列完成后,第i ii只兔子的颜色是a i a_iai

俗话说得好,“萝卜青菜,各有所爱”。小 C 发现,不同颜色的兔子可能有对胡萝卜的不同偏好。比如,银色的兔子最喜欢吃金色的胡萝卜,金色的兔子更喜欢吃胡萝卜叶子,而绿色的兔子却喜欢吃酸一点的胡萝卜……为了满足兔子们的要求,小 C 十分苦恼。所以,为了使得胡萝卜喂得更加准确,小 C 想知道在区间[ l j , r j ] [l_j,r_j][lj,rj]里有多少只颜色为c j c_jcj的兔子。

不过,因为小 C 的兔子们都十分地活跃,它们不是很愿意待在一个固定的位置;与此同时,小 C 也在根据她知道的信息来给兔子们调整位置。所以,有时编号为x j x_jxjx j + 1 x_j+1xj+1的两只兔子会交换位置。小 C 被这一系列麻烦事给难住了。你能帮帮她吗?

输入格式

从标准输入中读入数据。输入第 1 行两个正整数n nn,m mm

输入第 2 行n nn个正整数,第i ii个数表示第i ii只兔子的颜色a i a_iai

输入接下来m mm行,每行为以下两种中的一种:

  • 1 l j r j c j 1\ l_j\ r_j\ c_j1ljrjcj” :询问在区间[ l j , r j ] [l_j,r_j][lj,rj]里有多少只颜色为c j c_jcj的兔子;

  • 2 x j 2\ x_j2xj”:x j x_jxjx j + 1 x_j+1xj+1两只兔子交换了位置。

输出格式

输出到标准输出中。

对于每个 1 操作,输出一行一个正整数,表示你对于这个询问的答案。

输入输出样例 #1

输入 #1

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

输出 #1

1 2 2 3

说明/提示

【样例 1 说明】

前两个 1 操作和后两个 1 操作对应相同;在第三次的 2 操作后,3 号兔子和 4 号兔子

交换了位置,序列变为 1 2 2 3 3 3。

【数据范围与约定】

子任务会给出部分测试数据的特点。如果你在解决题目中遇到了困难,可以尝试只解 决一部分测试数据。 对于所有测试点,有1 ≤ l j < r j ≤ n , 1 ≤ x j < n 1 \le l_j < r_j \le n,1 \le x_j < n1lj<rjn,1xj<n。 每个测试点的数据规模及特点如下表:

特殊性质 1:保证对于所有操作 1,有∣ r j − l j ∣ ≤ 20 |r_j - l_j| \le 20rjlj20∣ r j − l j ∣ ≤ n − 20 |r_j - l_j| \le n - 20rjljn20

特殊性质 2:保证不会有两只相同颜色的兔子。

C++实现

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<vector>#include<algorithm>usingnamespacestd;intread(){intw=1,x=0,ch=getchar();for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')w=-1;for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';returnx*w;}constintMAXN=(int)3e5+100;intn,m,a[MAXN];vector<int>q[MAXN];intopt,l,r,x;intmain(){n=read(),m=read();for(inti=1;i<=n;i++){a[i]=read();q[a[i]].push_back(i);}while(m--){opt=read();if(opt==1){l=read(),r=read(),x=read();intptr_l=lower_bound(q[x].begin(),q[x].end(),l)-q[x].begin();intptr_r=upper_bound(q[x].begin(),q[x].end(),r)-q[x].begin()-1;if(ptr_l>ptr_r){printf("0\n");continue;}printf("%d\n",ptr_r-ptr_l+1);}else{x=read();if(a[x]==a[x+1])continue;intptr_l=lower_bound(q[a[x]].begin(),q[a[x]].end(),x)-q[a[x]].begin();q[a[x]][ptr_l]++;intptr_r=lower_bound(q[a[x+1]].begin(),q[a[x+1]].end(),x+1)-q[a[x+1]].begin();q[a[x+1]][ptr_r]--;swap(a[x],a[x+1]);}}return0;}

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 22:57:31

Vue3 + 高德地图 JS API 2.0 实战:打造多功能地址选择组件

在前端开发中&#xff0c;地图组件是非常常见的需求&#xff0c;尤其是地址选择、经纬度获取这类场景。本文将基于 Vue3 高德地图 JS API 2.0&#xff0c;详细讲解如何封装一个功能完整、易用性强的地图地址选择组件&#xff0c;包含地址搜索、地图点击选点、经纬度双向绑定等…

作者头像 李华
网站建设 2026/7/2 14:00:01

C++基于微服务脚手架的视频点播系统---客户端(2)

这是关于高性能即时通讯系统开发实战的续篇。在前文中&#xff0c;我们完成了系统架构设计的宏观规划、开发环境的精密部署以及版本控制策略的实施。本篇将深入客户端开发的微观层面&#xff0c;聚焦于应用程序启动流程的编排与主窗口视觉效果的深度定制。我们将探讨如何利用Qt…

作者头像 李华
网站建设 2026/6/26 16:41:10

大学生现在这样学网络安全,明年春招_offer_手到擒来!

网络安全学习必备收藏&#xff1a;从理论到实战&#xff0c;EDU SRC挖洞助力春招突围 文章针对网络安全学习者缺乏实战经验的问题&#xff0c;提出系统性解决方案&#xff1a;通过EDU SRC挖洞积累实战经验&#xff0c;包括信息收集、漏洞挖掘和报告提交的完整流程&#xff1b;…

作者头像 李华
网站建设 2026/6/27 1:18:53

从菜鸡到_offer_到手!网络安全面试实战全攻略

网络安全面试攻略&#xff1a;七分实力三分套路&#xff0c;收藏这份干货&#xff0c;offer轻松到手&#xff01; 本文解析网络安全面试技巧&#xff0c;强调"七分实力三分套路"的综合考验。从成果化自我介绍、甲方乙方面试侧重点差异&#xff0c;到应对不会问题的方…

作者头像 李华
网站建设 2026/6/26 16:42:44

C++ 拷贝构造 拷贝赋值 到底在干什么?——从对象出生到 RAII 思想

很多初学 C 的人&#xff0c;在学习到“拷贝构造函数”和“拷贝赋值运算符”时都会产生一个疑问&#xff1a;这两个东西到底有什么意义&#xff1f; 为什么要分两种&#xff1f; Java 里也没这么复杂啊&#xff1f;如果只是记语法&#xff0c;很快就会忘。 真正理解它们&#x…

作者头像 李华