[洛谷P3939]数颜色
题目大意:有n个物品,每个物品有一个颜色。现在有两种操作:1.查询l~r内有多少颜色为c的物品并输出。2.将第x个物品和第x+1个交换。现在让你实现这些操作。
解题思路:首先一共有300000种颜色,最多只有300000个物品,但如果直接开数组,结果可想而知。
所以考虑用vector保存每种颜色的编号。
并且我们保证每个vector里的值都是升序的。
首先考虑操作2。如果两个相邻的物品的位置交换,只要它们的颜色不同,则在vector中交换两个元素时,仍然保持升序。
那么如果颜色相同,就不用交换了,否则需要交换两个物品的颜色,并且在vector中也交换。
由于vector中是升序的,所以可以用二分查找(lower_bound)的方法找到两个物品的迭代器,然后交换里面的值即可。
对于操作1,很容易想到用vector右边的指针减去左边的指针。那么用二分出两个迭代器,然后相减即可。
总时间复杂度$O(m\log n)$。
C++ Code:
#include<cstdio>
#include<vector>
#include<cctype>
#include<algorithm>
using namespace std;
#define N 300005
#define vt vector<int>::iterator
int n,m,a[N];
vector<int>p[N];
inline int readint(){
char c=getchar();
for(;!isdigit(c);c=getchar());
int d=0;
for(;isdigit(c);c=getchar())
d=(d<<3)+(d<<1)+(c^'0');
return d;
}
int main(){
n=readint(),m=readint();
for(int i=1;i<=n;++i)p[a[i]=readint()].push_back(i);
while(m--){
int cz=readint();
if(cz==2){
int x=readint();
if(a[x]==a[x+1])continue;
vt p1=lower_bound(p[a[x]].begin(),p[a[x]].end(),x),
p2=lower_bound(p[a[x+1]].begin(),p[a[x+1]].end(),x+1);
*p1=x+1,*p2=x;
int f=a[x];
a[x]=a[x+1],a[x+1]=f;
}else{
int l=readint(),r=readint(),c=readint();
vt l1=lower_bound(p[c].begin(),p[c].end(),l),
r1=upper_bound(p[c].begin(),p[c].end(),r);
printf("%d\n",r1-l1);
}
}
return 0;
}
[洛谷P3939]数颜色的更多相关文章
- 2018.07.07 洛谷 P3939 数颜色(主席树)
P3939 数颜色 题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不 ...
- 洛谷——P3939 数颜色(暴力vecotr+二分)
P3939 数颜色 $vecotr$里二分就是好用,全是$STL$ 颜色数目比较少,可以对每一种颜色弄一个$vector$记录一下,查找$l,r$内颜色数为$x$的兔子数,直接在$G[x]$这个$ve ...
- 洛谷P3939 数颜色 二分查找
正解:二分 解题报告: 传送门! 话说其实我开始看到这题想到的是分块,,, 但是显然不用这么复杂,,,因为仔细看下这题,会发现每次只改变相邻的兔子的位置 所以开个vector(或者开个数组也成QwQ( ...
- 洛谷P3939 数颜色(二分 vector)
题意 题目链接 Sol 直接拿vector维护每种颜色的出现位置,然后二分一下. #include<bits/stdc++.h> using namespace std; const in ...
- [洛谷P3939]:数颜色(二分)
题目传送门 题目描述 小$C$的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不同的兔子可能有相同的颜色.小$C$把她标号从$1$到$n$的$n$只兔子排成长长的一排,来给他们喂胡萝卜吃.排列 ...
- Bzoj2120/洛谷P1903 数颜色(莫队)
题面 Bzoj 洛谷 题解 考虑对操作离线后分块处理询问操作(莫队算法),将询问操作按照编号分块后左端点第一关键字,右端点第二关键字排序(分块大小为\(n^{\frac 23}\)),对于每一个询问操 ...
- [bzoj2120] [洛谷P1903] 数颜色
Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜 ...
- 洛谷P1903 数颜色 [国家集训队] 莫队
正解:带修莫队 解题报告: 可以理解为引入时间参数,然后就是有了仨参数,关于这个修改同样的是,如果时间是相同的,不用搞,如果时间不相同做一下时光倒流/时光推移就成嘛 但是肯定既然这样的话,按照原来的s ...
- 2019.8.3 NOIP模拟测试12 反思总结【P3938 斐波那契,P3939 数颜色,P3940 分组】
[题解在下面] 早上5:50,Gekoo同学来到机房并表态:“打暴力,打暴力就对了,打出来我就赢了.” 我:深以为然. (这是个伏笔) 据说hzoi的人还差两次考试[现在是一次了]就要重新分配机房,不 ...
随机推荐
- GDB Layout
layout:用于分割窗口,可以一边查看代码,一边测试.主要有以下几种用法:layout src:显示源代码窗口layout asm:显示汇编窗口layout regs:显示源代码/汇编和寄存器窗口l ...
- day05-2 变量、常量、注释以及内存管理
目录 什么是变量 Python中定义变量 定义变量名的命名规范 什么是常量 定义常量 注释是什么 注释有什么用 内存管理(重要) 引用计数 垃圾回收机制 小整数池 定义变量的三个特征 什么是变量 变量 ...
- Is jQuery Still Relevant in 2018?
DOM Selection $('.someclass') document.querySelector('.someclass') document.querySlectorAll('.somecl ...
- CF487E Tourists(圆方树+堆+链剖)
本题解并不提供圆方树讲解. 所以不会圆方树的出门右转问yyb 没有修改的话圆方树+链剖. 方点的权值为点双连通分量里的最小值. 然后修改的话圆点照修,每一个方点维护一个小根堆. 考虑到可能被菊花卡死. ...
- 调整mysql数据库最大连接数
1.查看mariadb数据库最大连接数,默认为151 MariaDB [(none)]> show variables like 'max_connections'; +------------ ...
- java.util.UnknownFormatConversionException: Conversion = ''';
今天在测试一个新的项目,在执行sql查询报表的时候.由于我的sql中带有%,导致在输出日志时报错“java.util.UnknownFormatConversionException: Convers ...
- Qt之窗体拖拽、自适应分辨率、自适应大小
简述 在自定义无边框.标题栏的界面中,需要自己实现最小化.最大化.关闭.窗体背景等功能.最小化.最大化.关闭等按钮设计及功能比较简单,这里就不多做介绍.今天主要介绍一下绘制背景的问题,主要实现自适应屏 ...
- POJ 2773
不经意看见dis后的“mod”一词后,瞬间有了思路,点进去看,却发现别人想的和我的不一样——! 我是这样想的,利用的是剩余系+欧几里德带余除法的性质. 若两者GCD=1,则必有除数和余数GCD=1.于 ...
- HDU5411CRB and Puzzle(矩阵高速幂)
题目链接:传送门 题意: 一个图有n个顶点.已知邻接矩阵.问点能够反复用长度小于m的路径有多少. 分析: 首先我们知道了邻接矩阵A.那么A^k代表的就是长度为k的路径有多少个. 那么结果就是A^0+A ...
- 号外:Spark 1.3.0公布了,快来一起飞!
Spark 1.3.0 Release Note Spark 1.3.0在上周五正式公布.真是千呼万唤始出来.本次公布最大的惊喜就是DataFrame.另外一个值得关注的是Spark SQL从Alph ...