news 2026/4/18 1:59:49

打卡信奥刷题(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/4/18 0:42:07

Excel时间魔法:用NOW与TODAY函数实现动态年龄计算与倒计时

想让Excel表格中的年龄自动增长&#xff0c;或者创建实时更新的项目倒计时&#xff1f;NOW和TODAY这两个易失性函数是你的秘密武器。 在Excel中处理日期和时间数据时&#xff0c;我们常常需要让某些计算结果能够自动更新&#xff0c;反映当前的最新状态。无论是计算员工年龄、监…

作者头像 李华
网站建设 2026/4/16 11:55:23

基于深度学习YOLOv12的红外森林火灾火焰烟雾识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)

一、项目介绍 森林火灾是威胁生态环境和人类安全的重要灾害之一&#xff0c;快速准确的火灾检测对灾害防控至关重要。本文基于深度学习目标检测算法YOLOv12&#xff0c;构建了一套红外森林火灾火焰与烟雾检测系统。该系统利用红外图像数据&#xff0c;通过YOLOv12模型实现了对…

作者头像 李华
网站建设 2026/4/6 22:26:59

计算机是如何工作的

一.冯诺伊曼体系 CPU 中央处理器: 进⾏算术运算和逻辑判断. 存储器: 分为外存和内存, ⽤于存储数据(使⽤⼆进制⽅式存储) 输⼊设备: ⽤⼾给计算机发号施令的设备. 输出设备: 计算机个⽤⼾汇报结果的设备. 二.指令 1.概念 所谓指令&#xff0c;即指导 CPU 进⾏⼯作的命令…

作者头像 李华
网站建设 2026/4/4 0:19:23

标签是“养”出来的:如何让沉睡数据变成消金公司的印钞机

1. 撕开迷雾&#xff1a;消金业务的四层标签塔构建实战 做大数据的兄弟们都知道&#xff0c;标签这玩意儿&#xff0c;建起来容易&#xff0c;用起来难。很多公司搞了成百上千个标签&#xff0c;最后业务方只用“性别”和“年龄”&#xff0c;简直是资源的巨大浪费。在消费金融…

作者头像 李华