小 C 的兔子不是雪白的,而是五彩缤纷的。

题目

题目描述

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

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

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

输入输出格式

输入格式:

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

输入第 2 行 n 个正整数,第 i 个数表示第 只兔子的颜色 ​。

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

“1 lj rj cj” :询问在区间 [lj,rj]里有多少只颜色为 cj 的兔子;
“2 xj”: xj 和 xj+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
2
2
3

题解

分析

维护每个数字出现的位置就可以了,用vector存,1操作就输出尾位置在数字出现位置的位置减去首位置的就可以了。至于2操作,先判断2个位置上的数字是否相等,相等就跳过,不然就直接swap就可以了

代码

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<vector>
using namespace std;
const int maxn=300010;
const int inf=0xFFFFFFF;
vector<int>r[maxn]; int a[maxn],n,m;
inline int read() {
int x=0,w=1;
char ch=getchar();
while(ch!='-'&&(ch<'-'||ch>'9')) ch=getchar();
if(ch=='-') w=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-48,ch=getchar();
return x*w;
} void solve()
{
int cases,l,R,x;
while(m--)
{
cases=read();
if(cases==1)
{
l=read();R=read();x=read();
printf("%d\n",distance(lower_bound(r[x].begin(),r[x].end(),l),upper_bound(r[x].begin(),r[x].end(),R)));
}
else
{
x=read();
if(a[x]==a[x+1])continue;
int u=distance(r[a[x]].begin(),lower_bound(r[a[x]].begin(),r[a[x]].end(),x)); int v=distance(r[a[x+1]].begin(),lower_bound(r[a[x+1]].begin(),r[a[x+1]].end(),x+1));
r[a[x]][u]=x+1;
r[a[x+1]][v]=x;
swap(a[x],a[x+1]);
}
}
}
int main()
{
freopen("color.in","r",stdin);
freopen("color.out","w",stdout);
int i;
n=read();m=read();
for(register int i=1;i<=n;++i)
{
a[i]=read();
r[a[i]].push_back(i);
}
for(register int i=1;i<=300000;++i) r[i].push_back(inf);
solve();
return 0;
}

【题解】数颜色 STL vector数组的更多相关文章

  1. luogu 3939 数颜色 - STL(vector)

    传送门 分析: 虽然颜色种类很多,但是所有颜色个数之和n是一定的,这时候就可以使用vector对每个颜色维护一个坐标集合,空间只占n个. 对于查询L,R:直接一行: upper_bound(col[c ...

  2. 洛谷P3939 数颜色(二分 vector)

    题意 题目链接 Sol 直接拿vector维护每种颜色的出现位置,然后二分一下. #include<bits/stdc++.h> using namespace std; const in ...

  3. BZOJ 2120 数颜色(树状数组套主席树)

    1A啊,激动. 首先,不修改的情况下可以直接用主席树搞,修改的话,直接用主席树搞一次修改的情况下复杂度是O(nlogn)的. 就像你要求区间和一样,用前缀和查询是O(1),修改是O(n),只不过主席树 ...

  4. 【模拟8.03】数颜色(vector//主席树)

    才知道vector在插入值后是可以直接修改的... 那就很简单了 用vector的lowerbound这样的二分操作,提前储存每个颜色的位置 发现交换相对位置不变 关于vector的lowerboun ...

  5. 【题解】P3939数颜色

    [题解]P3939 数颜色 不要数据结构和模板学傻了... 考虑到兔子们交换都是相邻的,说明任何一次交换只会引起\(O(1)\)的变化. 我们开很多\(vector\)存没种兔子的下标就好了.到时候二 ...

  6. hdu5438 Ponds[DFS,STL vector二维数组]

    目录 题目地址 题干 代码和解释 参考 题目地址 hdu5438 题干 代码和解释 解答本题时参考了一篇代码较短的博客,比较有意思,使用了STL vector二维数组. 可以结合下面的示例代码理解: ...

  7. 牛客练习赛47 E DongDong数颜色 (树状数组维护区间元素种类数)

    链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...

  8. BZOJ_2120_数颜色_Set+树状数组+主席树

    BZOJ_2120_数颜色_Set+树状数组+主席树 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L ...

  9. bzoj 2120 数颜色 题解

    转载请注明:http://blog.csdn.net/jiangshibiao/article/details/23990489 [原题] 2120: 数颜色 Time Limit: 6 Sec  M ...

随机推荐

  1. Pytest自动化测试-简易入门教程(01)

    我们今天主讲的内容,就是测试框架Pytest,讲到这个测试框架对于没有做过Web自动化的伙伴来说,会觉得这个东西是陌生的,那么到底什么是框架呢?什么又是自动化呢?自动化为什么又要用框架呢? 难道我学自 ...

  2. Nmap浅析(2)——端口发现

    端口发现 ​ 每台网络设备最多有216(65536)个端口,端口的作用是实现"一机多用".操作系统分了65536个端口号,程序在发送的信息中加入端口号,操作系统在接收到信息后按照端 ...

  3. MFC的六大机制

    MFC的六大机制 程序的初始化过程 运行时类型识别 动态创建 永久保存 消息映射 命令传递 运行时类型识别 MFC的运行时类型识别就是在程序运行过程中判断某个对象是否属于某个类,MFC通过为需要进行运 ...

  4. Java容器 | 基于源码分析List集合体系

    一.容器之List集合 List集合体系应该是日常开发中最常用的API,而且通常是作为面试压轴问题(JVM.集合.并发),集合这块代码的整体设计也是融合很多编程思想,对于程序员来说具有很高的参考和借鉴 ...

  5. Ubuntu执行命令时,不sudo提示权限不足,sudo提示找不到该命令

    问题:Ubuntu执行命令时,不sudo提示权限不足,sudo提示找不到该命令 补充描述:尝试将命令所在路径添加到/etc/profile中(所有用户环境变量),结果sudo -i切换到root用户后 ...

  6. 为什么数字被int格式化后依旧可以用%s占位(勉强已答)

    为什么数字被int格式化后依旧可以用%s占位 答:可以看作str(obj)

  7. makefile的include用法

    include 使用方法 : include filename.mk 作用: 暂停当前的makefile执行,去执行指定的makefile,执行完毕后继续执行当前的makefile -include ...

  8. RHEL_高级磁盘管理(vdo、stratis)

    RHEL高级磁盘管理-VDO VDO简介 Virtual Data Optimizer 通过数据去重.压缩的方式来优化存储空间. VDO层放置在现有块存储设备上,例如Raid设备.本地磁盘设备. LV ...

  9. mitogen附带文件到远程主机

    #!/usr/bin/env python # import mitogen.master import mitogen.select import subprocess import logging ...

  10. iPhone手机怎么和电脑互传文件,一条数据线搞定

    官方的方法是,通过iTunes进行文件的传输.传个文件还要特意安装个iTunes,实在是麻烦. 其实我们只需要在苹果应用商店app store下载Documents这个文件就可以. 另外,Docume ...