Description###

墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令: 1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。 2、 R P Col 把第P支画笔替换为颜色Col。为了满足墨墨的要求,你知道你需要干什么了吗?

Input###

第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数。第2行N个整数,分别代表初始画笔排中第i支画笔的颜色。第3行到第2+M行,每行分别代表墨墨会做的一件事情,格式见题干部分。

Output###

对于每一个Query的询问,你需要在对应的行中给出一个数字,代表第L支画笔到第R支画笔中共有几种不同颜色的画笔。

Sample Input###

6 5

1 2 3 4 5 5

Q 1 4

Q 2 6

R 1 2

Q 1 4

Q 2 6

Sample Output###

4

4

3

4

HINT###

对于100%的数据,N≤10000,M≤10000,修改操作不多于1000次,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。


想法##

带修改莫队。

与普通莫队其实一个意思,就是多了一个tim表示在这个询问操作时已进行了几次修改。

进行一些修改操作使当前状态与这个询问时原本的状态相同。


代码##

注意细节!!!

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath> using namespace std; const int N = 10005; int block;
int bl(int x) { return (x-1)/block+1; } int cnt1,cnt2;
struct ask{
int l,r,id,tim;
bool operator < (const ask &b) const{
return bl(l)<bl(b.l) || (bl(l)==bl(b.l) && r<b.r);
}
}q[N];
struct cg{
int x,fr,to;
}d[N]; int a[N],cnt[1000005];
int cur,L,R;
void add(int x){
cnt[a[x]]++;
if(cnt[a[x]]==1) cur++;
}
void del(int x){
cnt[a[x]]--;
if(cnt[a[x]]==0) cur--;
} void cg_add(int x){
int id=d[x].x;
if(L<=id && id<=R){ // 注意是id(即d[x].x)啊,并不是x
del(id);
a[id]=d[x].to;
add(id);
}
else a[id]=d[x].to;
}
void cg_del(int x){
int id=d[x].x;
if(L<=id && id<=R){
del(id);
a[id]=d[x].fr;
add(id);
}
else a[id]=d[x].fr;
} int n,m;
int ans[N]; int main()
{
char opt[1];
int x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=m;i++){
scanf("%s",opt);
scanf("%d%d",&x,&y);
if(opt[0]=='Q'){
cnt1++;
q[cnt1]=(ask){x,y,cnt1,cnt2};
}
else{
cnt2++;
d[cnt2]=(cg){x,a[x],y};
a[x]=y;
}
}
block=sqrt(n);
sort(q+1,q+cnt1+1); int t=cnt2;
L=R=1;
cnt[a[1]]++; cur=1;
for(int i=1;i<=cnt1;i++){
while(R<q[i].r) add(++R);
while(L>q[i].l) add(--L);
while(R>q[i].r) del(R--);
while(L<q[i].l) del(L++);
while(t>q[i].tim) cg_del(t--); //注意顺序!!
while(t<q[i].tim) cg_add(++t);
ans[q[i].id]=cur;
}
for(int i=1;i<=cnt1;i++) printf("%d\n",ans[i]); return 0;
}

[bzoj2120] [洛谷P1903] 数颜色的更多相关文章

  1. Bzoj2120/洛谷P1903 数颜色(莫队)

    题面 Bzoj 洛谷 题解 考虑对操作离线后分块处理询问操作(莫队算法),将询问操作按照编号分块后左端点第一关键字,右端点第二关键字排序(分块大小为\(n^{\frac 23}\)),对于每一个询问操 ...

  2. 洛谷P1903 数颜色 [国家集训队] 莫队

    正解:带修莫队 解题报告: 可以理解为引入时间参数,然后就是有了仨参数,关于这个修改同样的是,如果时间是相同的,不用搞,如果时间不相同做一下时光倒流/时光推移就成嘛 但是肯定既然这样的话,按照原来的s ...

  3. BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]

    BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...

  4. 2018.07.07 洛谷 P3939 数颜色(主席树)

    P3939 数颜色 题目背景 大样例下发链接:http://pan.baidu.com/s/1c0LbQ2 密码:jigg 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不 ...

  5. 洛谷——P3939 数颜色(暴力vecotr+二分)

    P3939 数颜色 $vecotr$里二分就是好用,全是$STL$ 颜色数目比较少,可以对每一种颜色弄一个$vector$记录一下,查找$l,r$内颜色数为$x$的兔子数,直接在$G[x]$这个$ve ...

  6. 洛谷P3939 数颜色 二分查找

    正解:二分 解题报告: 传送门! 话说其实我开始看到这题想到的是分块,,, 但是显然不用这么复杂,,,因为仔细看下这题,会发现每次只改变相邻的兔子的位置 所以开个vector(或者开个数组也成QwQ( ...

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

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

  8. [洛谷P3939]数颜色

    题目大意:有n个物品,每个物品有一个颜色.现在有两种操作:1.查询l-r内有多少颜色为c的物品并输出.2.将第x个物品和第x+1个交换.现在让你实现这些操作. 解题思路:首先一共有300000种颜色, ...

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

    题目传送门 题目描述 小$C$的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不同的兔子可能有相同的颜色.小$C$把她标号从$1$到$n$的$n$只兔子排成长长的一排,来给他们喂胡萝卜吃.排列 ...

随机推荐

  1. Spark in action Spark 以及SparkR的安装配置说明

    Spark以及SparkR的安装(standalone模式) From :ssdutsu @ Inspur Company  suzhiyuan2006@gmail.com 操作系统 CentOS 7 ...

  2. js实现bind

    Function.prototype.bind=function(ctx,...lastArgs){ let self=this return (...laterArgs)=>self.appl ...

  3. Linux 内核驱动支持什么设备

    struct usb_device_id 结构提供了这个驱动支持的一个不同类型 USB 设备的列表. 这个 列表被 USB 核心用来决定给设备哪个驱动, 并且通过热插拔脚本来决定哪个驱动自动加载, 当 ...

  4. 【2016常州一中夏令营Day2】

    小 W 学数学[问题描述]为了测试小 W 的数学水平,果果给了小 W N 个点,问他这 N 个点能构成的三角形个数.[输入格式]第一行一个整数 N,代表点数.接下来 N 行,每行两个非负整数 X.Y, ...

  5. delphi 子窗体最大化

    procedure TForm2.FormCreate(Sender: TObject);begin perform(WM_SIZE,SIZE_MAXIMIZED,0);end; http://blo ...

  6. QT中加载动态链接库

    一.添加第三方的头文件 这个问题再简单不过了,不过我还是要说下. 首先,添加头文件  #include "ControlCAN.h" 然后,再将这个头文件放到工程的目录下,就OK了 ...

  7. c++ 队列算法

    include using namespace std; #define Maxsize 5 typedef int DataType; typedef struct Queue { DataType ...

  8. HTTP中GET与POST的区别 99%的错误认识

    @[TOC本篇文章分两部分,第一部分可以列为初为新人的装逼失败模式,第二部分列为修炼低调模式. 装逼失败模式:99%的人对GET和POST的认识 修炼低调模式:1%不知道的进阶认识 GET和POST, ...

  9. linux-free、lscpu、

    1.free -h 以人类可读的形式显示 -m 以MB为单位显示 -w 将buffers和cache分开单独显示(针对centos7系统) centos6上: centos7上: -s 动态查看内存信 ...

  10. 从零开始のcocos2dx生活(九)CCBReader

    NodeLoaderLibrary是用来存储节点加载器类型的类,通过registerDefaultNodeLoaders()可以注册所有默认类型的加载器 在CocosBuilder的使用手册中: 1. ...