[洛谷P3939]:数颜色(二分)

题目传送门


题目描述

小$C$的兔子不是雪白的,而是五彩缤纷的。每只兔子都有一种颜色,不同的兔子可能有相同的颜色。小$C$把她标号从$1$到$n$的$n$只兔子排成长长的一排,来给他们喂胡萝卜吃。排列完成后,第$i$只兔子的颜色是$a_i$。
俗话说得好,“萝卜青菜,各有所爱”。小$C$发现,不同颜色的兔子可能有对胡萝卜的不同偏好。比如,银色的兔子最喜欢吃金色的胡萝卜,金色的兔子更喜欢吃胡萝卜叶子,而绿色的兔子却喜欢吃酸一点的胡萝卜……为了满足兔子们的要求,小$C$十分苦恼。所以,为了使得胡萝卜喂得更加准确,小$C$想知道在区间$[l_j,r_j]$里有多少只颜色为$c_j$的兔子。不过,因为小$C$的兔子们都十分地活跃,它们不是很愿意待在一个固定的位置;与此同时,小$C$也在根据她知道的信息来给兔子们调整位置。所以,有时编号为$x_j$和$x_{j+1}$的两只兔子会交换位置。
小$C$被这一系列麻烦事给难住了。你能帮帮她吗?


输入格式

输入第$1$行两个正整数$n,m$。
输入第$2$行$n$个正整数,第$i$个数表示第$a_i$只兔子的颜色 。
输入接下来$m$行,每行为以下两种中的一种:
“$1\ l_j\ r_j\ c_j$”:询问在区间$[l_j,r_j]$里有多少只颜色为$c_j$的兔子;
“$2\ x_j$:$x_j$和$x_{j+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

样例输入2:

10 9
1 2 3 4 5 6 1 2 3 4
1 1 3 3
1 4 6 3
2 3
1 1 3 3
1 4 6 3
1 1 10 4
1 1 10 3
1 1 10 2
1 1 10 1

样例输出2:

1
0
0
1
2
2
2
2


数据范围与提示

样例$1$说明:

前两个$1$操作和后两个$1$操作对应相同;在第三次的$2$操作后,$3$号兔子和$4$号兔子交换了位置,序列变为$1\ 2\ 2\ 3\ 3\ 3$。

数据范围:

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

测试点       $n$                    操作$1$             操作$2$             $a_i,c_j$           特殊性质$1$           特殊性质$2$
    $1$           $2$                     $6$                     $0$                     $\leqslant  2$                     $\surd$                          $\surd$
    $2$           $2$                     $1000$             $1000$              $\leqslant 1000$              $\surd$                          $\surd$
    $3$          $1000$              $1000$              $0$                     $\leqslant 1000$              $\times$                          $\times$
    $4$          $1000$              $1000$              $1000$              $\leqslant  10$                   $\times$                          $\times$
    $5$          $1000$              $1000$              $1000$              $\leqslant 1000$              $\times$                         $\surd$
    $6$          $1000$              $1000$              $1000$              $\leqslant 1000$              $\times$                         $\times$
    $7$          $5\times {10}^4$        $5\times {10}^4$        $0$                     $\leqslant 5\times {10}^4$        $\surd$                         $\times$
    $8$          $5\times {10}^4$        $5\times {10}^4$        $5\times {10}^4$       $\leqslant 10$                   $\times$                         $\times$
    $9$          $5\times {10}^4$        $5\times {10}^4$        $5\times {10}^4$       $\leqslant 5\times {10}^4$        $\times$                         $\surd$
    $10$        $5\times {10}^4$        $5\times {10}^4$        $5\times {10}^4$       $\leqslant 5\times {10}^4$        $\times$                         $\times$
    $11$        $5\times {10}^4$        $5\times {10}^4$        $5\times {10}^4$       $\leqslant 5\times {10}^4$        $\times$                         $\times$
    $12$        $5\times {10}^4$        $5\times {10}^4$        $5\times {10}^4$       $\leqslant 5\times {10}^4$        $\times$                         $\times$
    $13$        $5\times {10}^4$        $5\times {10}^4$        $5\times {10}^4$       $\leqslant 5\times {10}^4$        $\times$                         $\times$
    $14$        $3\times {10}^5$        $3\times {10}^5$        $3\times {10}^5$       $\leqslant 3\times {10}^5$        $\times$                         $\times$
    $15$        $3\times {10}^5$        $3\times {10}^5$        $3\times {10}^5$       $\leqslant 10$                   $\times$                         $\times$
    $16$        $3\times {10}^5$        $3\times {10}^5$        $3\times {10}^5$       $\leqslant 3\times {10}^5$        $\times$                         $\surd$
    $17$        $3\times {10}^5$        $3\times {10}^5$        $3\times {10}^5$       $\leqslant 3\times {10}^5$        $\surd$                         $\times$
    $18$        $3\times {10}^5$        $3\times {10}^5$        $3\times {10}^5$       $\leqslant 3\times {10}^5$        $\times$                         $\times$
    $19$        $3\times {10}^5$        $3\times {10}^5$        $3\times {10}^5$       $\leqslant 3\times {10}^5$        $\times$                         $\times$
    $20$        $3\times {10}^5$        $3\times {10}^5$        $3\times {10}^5$       $\leqslant 3\times {10}^5$        $\times$                         $\times$


题解

$30\%$算法:

啥也甭管,暴力搞就好了。

时间复杂度:$\Theta(n\times m)$。

期望得分:$30$分(朴素),$60$分($luoguO2+$卡常)。

$65\%$算法:

树套树。

时间复杂度:$\Theta(n\log^2n)$。

带修莫队。

时间复杂度:$\Theta(n^{\frac{5}{3}})$。

期望得分:$60\thicksim 100$分。

$100\%$算法:

记录每种颜色的每个兔子的出现位置,然后进行二分查找答案,操作$2$只需要改变坐标即可。

需要注意的是,如果交换的两个兔子颜色一样不要交换它们,否则会导致坐标的无序。

时间复杂度:$\Theta(n\log n)$。

期望得分:$100$分。


代码时刻

$30\%$算法(朴素):

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[300001];
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	while(m--)
	{
		int opt;
		scanf("%d",&opt);
		if(opt==1)
		{
			int l,r,c,ans=0;
			scanf("%d%d%d",&l,&r,&c);
			for(int i=l;i<=r;i++)
				if(a[i]==c)ans++;
			printf("%d\n",ans);
		}
		else
		{
			int x;
			scanf("%d",&x);
			swap(a[x],a[x+1]);
		}
	}
	return 0;
}

$30\%$算法($luoguO2$+卡常):

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#pragma GCC optimize(s)
using namespace std;
int n,m;
int a[300001];
int main()
{
	scanf("%d%d",&n,&m);
	for(register int i=1;i<=n;i++)scanf("%d",&a[i]);
	while(m--)
	{
		register int opt;
		scanf("%d",&opt);
		if(opt==1)
		{
			register int l,r,c,ans=0;
			scanf("%d%d%d",&l,&r,&c);
			for(register int i=l;i<=r;i++)
				if(a[i]==c)ans++;
			printf("%d\n",ans);
		}
		else
		{
			register int x;
			scanf("%d",&x);
			swap(a[x],a[x+1]);
		}
	}
	return 0;
}

$65\%$算法(常数小,可AC):

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[300001];
int rt[300001],trsum[10000000],son[10000000][2],tot;
void change(int &x,int l,int r,int to,int d)
{
	if(!x)x=++tot;
	trsum[x]+=d;
	if(l==r)return;
	int mid=(l+r)>>1;
	if(to<=mid)change(son[x][0],l,mid,to,d);
	else change(son[x][1],mid+1,r,to,d);
}
int ask(int x,int l,int r,int L,int R)
{
	if(!x)return 0;
	if(l==L&&r==R)return trsum[x];
	int mid=(l+r)>>1;
	if(L>mid)return ask(son[x][1],mid+1,r,L,R);
	else if(R<=mid)return ask(son[x][0],l,mid,L,R);
	else return ask(son[x][0],l,mid,L,mid)+ask(son[x][1],mid+1,r,mid+1,R);
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		change(rt[a[i]],1,n,i,1);
	}
	while(m--)
	{
		int opt;
		scanf("%d",&opt);
		if(opt==1)
		{
			int l,r,c;
			scanf("%d%d%d",&l,&r,&c);
			printf("%d\n",ask(rt[c],1,n,l,r));
		}
		else
		{
			int x;
			scanf("%d",&x);
			change(rt[a[x  ]],1,n,x  ,-1);
			change(rt[a[x  ]],1,n,x+1, 1);
			change(rt[a[x+1]],1,n,x+1,-1);
			change(rt[a[x+1]],1,n,x  , 1);
			a[x]^=a[x+1]^=a[x]^=a[x+1];
		}
	}
	return 0;
}

$100\%$算法:

#include<bits/stdc++.h>
using namespace std;
int n,m,a[300001];
vector<int> v[300001];
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		v[a[i]].push_back(i);
	}
	while(m--)
	{
		int opt;
		scanf("%d",&opt);
		if(opt==1)
		{
			int l,r,c;
			scanf("%d%d%d",&l,&r,&c);
			printf("%d\n",upper_bound(v[c].begin(),v[c].end(),r)-lower_bound(v[c].begin(),v[c].end(),l));
		}
		else
		{
			int x;
			scanf("%d",&x);
			if(a[x]!=a[x+1])
			{
				(*lower_bound(v[a[x]].begin(),v[a[x]].end(),x))++;
				(*lower_bound(v[a[x+1]].begin(),v[a[x+1]].end(),x+1))--;
				swap(a[x],a[x+1]);
			}
		}
	}
	return 0;
}

rp++

转载于:https://www.cnblogs.com/wzc521/p/11295908.html

【线段树 二分查找 系统二分】P3939 数颜色|普及+ 小 C 的兔子不是雪白的,而是五彩缤纷的。每只兔子都有一种颜色,不同的兔子可能有 相同的颜色。小 C 把她标号从 1 到 nnn 的 nnn 只兔子排成长长的一排,来给他们喂胡萝卜吃。 排列完成后,第 iii 只兔子的颜色是 aia_iai​。俗话说得好,“萝卜青菜,各有所爱”。小 C 发现,不同颜色的兔子可能有对胡萝卜的 不同偏好。比如,银色的兔子最喜欢吃金色的胡萝卜,金色的兔子更喜欢吃胡萝卜叶子,而 绿色的兔子却喜欢吃酸一点的胡萝卜……为了满 阅读详情

相关推荐

在mac OS下安装SQL Developer

最近一直在折腾Oracle数据库,但由于电脑是mac系统,plsql developer用不了,远程管理一直不是很方便。后来听说Navicat不错,就也装了个试试看,发现界面看起来确实不错。今天心血来潮,想试试oracle自己开发的client。用惯plsql developer的人也可以来试试看,毕竟是自己人开发的,兼容性应该会不错吧。下面就把安装过程分享给新手或者需要帮助的朋友。 1.

bonbonboo的专栏 2万+

【洛谷P1903】【BZOJ2120】数颜色 / 维护队列【带修莫队】

题目大意: 题目链接: 洛谷:https://www.luogu.org/problemnew/show/P1903 BZOJ:https://www.lydsy.com/JudgeOnline/problem.php?id=2120 nnn只画笔,维护以下操作: Q L RQ\ L\ RQ L R代表询问你从第LLL支画笔到第RRR支画笔中共有几种不...

stoorz 355

PointNet/PointNet++模型调参实战:如何用PyTorch让你的点云分割精度再涨5个点?

本文深入探讨了PointNet/PointNet++模型在点云分割中的调参技巧,通过PyTorch实现精度提升5个点的实战方法。重点分析了点云密度自适应策略、感受野与细节保留的平衡,以及训练加速与稳定性技巧,适用于电力巡检、自动驾驶等场景的激光点云数据处理。

weixin_30836759的博客 477

洛谷P3939 数颜色【主席树 or 莫队】

题目简述 小 C 把她标号从1到n的n只兔子排成长长的一排,来给他们喂胡萝卜吃。 第 i 只兔子的颜色是 a_i 小 C 想知道在区间 [l_j,r_j] 里有多少只颜色为 c_j的兔子。 有时编号为 x_j 和 x_j+1的两只兔子会交换位置 输入格式 输入第 1 行两个正整数 n,m。 输入第 2 行 n 个正整数,第 i 个数表示第 i 只兔子的颜色 a_i 输入接下来 m 行,每行为以下两种中的一种: “1 lj rj cj“1\ l_j\ r_j\ c_j“1&nbs

niiick 413

避坑指南:ZYNQ MPSOC QSPI固化时MT25QU256闪存的特殊配置

本文针对Xilinx ZYNQ UltraScale+ MPSoC平台,详细解析了使用Vitis工具将BOOT.bin固化至Micron MT25QU256ABA QSPI NOR Flash时的特殊配置与避坑指南。重点阐述了Init文件的真实作用、电压与频率的精确匹配策略,以及针对该闪存型号的初始化序列,帮助工程师解决烧录失败、启动异常等常见问题,确保系统可靠启动。

weixin_29175469的博客 271

嵌入式系统开发笔记96:将STM32CubeIDE设置为中文

本文介绍将STM32CubeIDE设置为中文的方法。

snmplink的博客 8538

【洛谷P1903】数颜色

题目大意:给定一个长度为 N 的序列,每个点有一个颜色。现给出 M 个操作,支持单点修改颜色和询问区间颜色数两个操作。 题解:学会了序列带修改的莫队。 莫队本身是不支持修改的。带修该莫队的本质也是对询问进行分块,不过在莫队转移时需要多维护一个时间维度,即:每个操作的相对顺序。具体来讲,将序列分成 \(O(n^{1 \over 3})\) 块,每个块的大小是 \(O(n^{2 \over ...

K1385170的博客 272

Python实现PDB文件预处理

蛋白质结构研究依赖PDB文件存储的三维结构数据,但原始文件常含无关的水分子、离子和非标准残基等干扰信息。本文介绍了一个基于BioPython的Python预处理脚本,可自动清理PDB文件,主要功能包括:1)移除短于阈值的蛋白质链;2)过滤非标准氨基酸;3)可选保留水分子和金属离子。该脚本逻辑清晰,支持批量处理,能显著提升结构比对、分子对接等分析前的数据准备效率,为后续生物信息学研究提供更纯净的结构数据基础。

Protein Designer的博客 568

关于洛谷的答案测试点说明

浴各评测状态 各个评测状态 AC: Accept,程序通过。 CE: Compile Error,编译错误。 PC: Partially Correct,部分正确。 WA: Wrong Answer,答案错误。 RE: Runtime Error,运行时错误。 TLE: Time Limit Exceeded,超出时间限制。 MLE: Memory Limit Exceeded,超出内存限制。 ...

zjcoming 6469

基于多智能体强化学习的轨道追逃博弈方法复现

本文提出了一种基于多智能体深度强化学习(MADDPG)的空间轨道追逃博弈方法。通过构建Actor-Critic网络架构,采用集中训练分布式执行的策略,使卫星群能够自主协调完成对非合作目标的围捕任务。代码实现了经验回放缓冲区、噪声探索机制和网络参数更新等核心功能,通过奖励函数设计平衡最短时间、燃料消耗和碰撞规避等目标。仿真结果表明该方法能有效利用数量优势,涌现出智能协同行为,为解决复杂空间博弈问题提供了新思路。

huanghm88的专栏 337

Qt图形几何之QRect详解:从基础操作到高级功能全解析

本文全面介绍了Qt框架中的QRect类,详细解析了其核心功能和使用方法。主要内容包括:1)QRect的基本概念与多种构造函数;2)矩形属性获取和状态判断方法;3)几何操作函数(移动、调整大小等);4)几何关系判断(包含、相交等);5)坐标变换和边距处理;6)实用功能与QRectF转换;7)综合应用示例(图形界面、碰撞检测、布局管理);8)性能优化建议和常见陷阱。通过丰富的代码示例,展示了QRect在Qt图形编程中的实际应用,帮助开发者掌握矩形处理的各项操作技巧,提升图形界面开发效率。

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 119

数颜色(洛谷-P1903)

题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会向你发布如下指令: 1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。 2、 R P Col 把第P支画笔替换为颜色Col。 为了满足墨墨的要求,你知道你需要干什么了吗? 输入输出格式 输入格式: 第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事...

Alex_McAvoy的博客 720

基于DRU-HVDC的构网型海上风电场环流机理仿真复现

本文介绍了基于DRU-HVDC的构网型海上风电场环流机理仿真模型的构建方法。主要内容包括: 完整的Simulink模型结构,包含主模型文件GFM_DRU_Main.slx和配置脚本GFM_DRU_Setup.m 系统参数设置,包括基础频率(20Hz)、电压基准值(690V)、功率基准值(2MVA)等 四种仿真场景配置:电压不平衡、相位不平衡、阻抗不平衡和频率不平衡 风力发电机(WT)子系统的详细构建步骤,包含电压源、输出阻抗和测量模块 变压器和DRU整流器的参数设置 该模型可用于研究构网型风电场的环流机理。

huanghm88的专栏 262

洛谷P3939 数颜色 二分查找

正解:二分 解题报告: 传送门! 话说其实我开始看到这题想到的是分块,,, 但是显然不用这么复杂,,,因为仔细看下这题,会发现每次只改变相邻的兔子的位置 所以开个vector(或者开个数组也成QwQ(数组就能用lower_bound 按顺序存下来每个颜色的兔子的位置,每次修改只用O(1)地改就好了 然后复杂度是O(nlogn),和莫队复杂度一样却简单很多 over (对...

qq_42692055的博客 207

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

[luogu]P3939 数颜色[二分]

[luogu]P3939 数颜色 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的。每只兔子都有一种颜色,不同的兔子可能有 相同的颜色。小 C 把她标号从 1 到 n的 n只兔子排成长长的一排,来给他们喂胡萝卜吃。 排列完成后,第i 只兔子的颜色是 ai​。 俗话说得好,“萝卜青菜,各有所爱”。小 C 发现,不同颜色的兔子可能有对胡萝卜的 不同偏好。比如,银色的兔子最喜欢...

diezhen8177的博客 273

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

洛谷P3939 数颜色(二分 vector)

题意 题目链接 Sol 直接拿vector维护每种颜色的出现位置,然后二分一下。 #include&lt;bits/stdc++.h&gt; using namespace std; const int MAXN = 3e5 + 10; inline int read() { char c = getchar(); int x = 0, f = 1; while(c &lt; '0...

weixin_34148508的博客 205

洛谷 P3939 数颜色

洛谷 P3939 数颜色 题意 有 nnn 只兔子,每个兔子有各种颜色 aia_iai​ ,然后给出 mmm 次操作: 1 l r c 表示询问区间 [l,r][l,r][l,r] 内有多少种不同的颜色; 2 x 表示交换 ax,ax+1a_x,a_{x+1}ax​,ax+1​ 。 解法 用vector 数组记录每个颜色的出现位置即可,这样询问操作可以使用upperbound()-lowerbound() 来查询,因为每次交换一定是相邻两个交换,所以只要二分找到两个颜色的位置,然后位置加一或者减一即可。

bandiaoz的博客 257

洛谷P3939 数颜色 vector乱搞

洛谷P3939 数颜色 标签 vector乱搞 二分 简明题意 给一个序列(n <= 3e5),现需要你支持两种操作。 询问区间[L,R]中有多少个值为x的数 交换第k和k+1个数 思路 首先,这题需要你统计数出现的个数,是不是主席数立马用上心头?但是对于交换操作,似乎不是那么容易~ 好吧,这题正解是可以vector二分乱搞的。我们先开一个vector<i...

danzh 366

[洛谷P3939]数颜色

题目大意:有n个物品,每个物品有一个颜色。现在有两种操作:1.查询l~r内有多少颜色为c的物品并输出。2.将第x个物品和第x+1个交换。现在让你实现这些操作。 解题思路:首先一共有300000种颜色,最多只有300000个物品,但如果直接开数组,结果可想而知。 所以考虑用vector保存每种颜色的编号。 并且我们保证每个vector里的值都是升序的。 首先考虑操作2。如果两个相邻...

1045

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

本文介绍了P3939数颜色问题的解决方案。题目描述了一个兔子颜色序列的查询和交换操作:查询区间内某种颜色的兔子数量,以及交换相邻兔子的位置。C++实现使用vector数组存储每种颜色的位置索引,通过二分查找高效处理查询和交换操作。对于查询操作,使用lower_bound和upper_bound确定区间内的元素数量;对于交换操作,更新相应颜色的索引位置并交换数组元素。该解法有效地处理了动态序列的查询和修改需求,适用于大规模数据情况。

Loge谈信奥--一个专注于信奥人的博客 479

洛谷·数颜色

洛谷P3939 数颜色 线段树 动态开点

樱狸✨愿携清风归来处 587

思维题 数颜色(洛谷 P3939)

数颜色 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的。每只兔子都有一种颜色,不同的兔子可能有 相同的颜色。小 C 把她标号从 1 到 n 的 n 只兔子排成长长的一排,来给他们喂胡萝卜吃。 排列完成后,第 ii 只兔子的颜色是 a_i。 俗话说得好,“萝卜青菜,各有所爱”。小 C 发现,不同颜色的兔子可能有对胡萝卜的 不同偏好。比如,银色的兔子最喜欢吃金色的胡萝卜,金色的兔子更喜欢吃胡萝卜叶...

不知所云的博客 1111
上一篇: [洛谷P3938]:斐波那契(fibonacci)(数学)
下一篇: Word 2007切换窗口后鼠标不能点的问题补充
badiu_30394251
博客等级 码龄11年 124粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值