题目描述

墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会向你发布如下指令:

\(1\)、 \(Q\) \(L\) \(R\)代表询问你从第\(L\)支画笔到第\(R\)支画笔中共有几种不同颜色的画笔。

\(2\)、 \(R\) \(P\) \(Col\) 把第\(P\)支画笔替换为颜色\(Col\)。

为了满足墨墨的要求,你知道你需要干什么了吗?

输入格式

第\(1\)行两个整数\(N\),\(M\),分别代表初始画笔的数量以及墨墨会做的事情的个数。

第\(2\)行\(N\)个整数,分别代表初始画笔排中第\(i\)支画笔的颜色。

第\(3\)行到第\(2+M\)行,每行分别代表墨墨会做的一件事情,格式见题干部分。

输出格式

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

输入输出样例

输入 #1

6 5

1 2 3 4 5 5

Q 1 4

Q 2 6

R 1 2

Q 1 4

Q 2 6

输出 #1

4

4

3

4

说明/提示

对于\(30\%\)的数据,\(n,m \leq 10000\)

对于\(60\%\)的数据,\(n,m \leq 50000\)

对于所有数据,\(n,m \leq 133333\)

所有的输入数据中出现的所有整数均大于等于\(1\)且不超过\(10^6\)。

本题可能轻微卡常数

分析

带修改操作的莫队,比普通的莫队多了一维时间的限制

此时我们的块长需要调整至 \(n^{\frac{2}{3}}\)

排序时:

第一关键字:左端点所在块编号,从小到大排序

第二关键字:右端点所在块编号,从小到大排序

第三关键字:经历的修改次数。也可以说是询问的先后,先询问的排前面

代码

#include<cstdio>
#include<cmath>
#include<algorithm>
#define rg register
inline int read(){
rg int x=0,fh=1;
rg char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') fh=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*fh;
}
const int maxn=150000,maxm=1e6+5;
struct asd{
int l,r,c,id;
asd(){}
asd(int aa,int bb,int cc,int dd){
l=aa,r=bb,c=cc,id=dd;
}
}b[maxn];
int n,m,a[maxn],shuyu[maxn],q[maxn][3],cnt1,cnt2,d[maxn],blo,sum[maxm],ans[maxn],tot;
char s[10];
bool cmp(asd aa,asd bb){
if(shuyu[aa.l]==shuyu[bb.l] && shuyu[aa.r]==shuyu[bb.r]){
return aa.id<bb.id;
} else if(shuyu[aa.l]==shuyu[bb.l]){
if(shuyu[aa.l]&1) return aa.r<bb.r;
else return aa.r>bb.r;
} else {
return aa.l<bb.l;
}
};
inline void xg(int now,int op){
if(sum[now]==0) tot++;
sum[now]+=op;
if(sum[now]==0) tot--;
}
int main(){
n=read(),m=read();
blo=pow(n,(double)2/(double)3);
for(rg int i=1;i<=n;i++){
a[i]=read();
d[i]=a[i];
shuyu[i]=(i-1)/blo+1;
}
rg int aa,bb;
for(rg int i=1;i<=m;i++){
scanf("%s",s+1);
aa=read(),bb=read();
if(s[1]=='Q'){
cnt1++;
b[cnt1]=asd(aa,bb,cnt2,cnt1);
} else {
cnt2++;
q[cnt2][0]=aa,q[cnt2][1]=d[aa],q[cnt2][2]=bb;
d[aa]=bb;
}
}
std::sort(b+1,b+1+cnt1,cmp);
rg int l=1,r=0,lat=0;
for(rg int i=1;i<=cnt1;i++){
while(lat<b[i].c){
lat++;
if(l<=q[lat][0] && r>=q[lat][0]){
xg(q[lat][1],-1);
xg(q[lat][2],1);
}
a[q[lat][0]]=q[lat][2];
}
while(lat>b[i].c){
if(l<=q[lat][0] && r>=q[lat][0]){
xg(q[lat][2],-1);
xg(q[lat][1],1);
}
a[q[lat][0]]=q[lat][1];
lat--;
}
while(l>b[i].l){
l--;
xg(a[l],1);
}
while(r<b[i].r){
r++;
xg(a[r],1);
}
while(l<b[i].l){
xg(a[l],-1);
l++;
}
while(r>b[i].r){
xg(a[r],-1);
r--;
}
ans[b[i].id]=tot;
}
for(rg int i=1;i<=cnt1;i++){
printf("%d\n",ans[i]);
}
return 0;
}

洛谷 P1903 [国家集训队]数颜色 / 维护队列 带修莫队的更多相关文章

  1. Luogu P1903 [国家集训队]数颜色 / 维护队列 (带修莫队)

    #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...

  2. P1903 [国家集训队]数颜色 / 维护队列 带修改莫队

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

  3. 洛谷P1903 [国家集训队]数颜色 / 维护队列 ( 带 修 )

    题意:有两种操作: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col. 对每个1操作 输出答案: 带修莫队 模板题 (加 ...

  4. 洛谷 P1903 [国家集训队]数颜色 / 维护队列

    墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. \(Q\) \(L\) \(R\) 代表询问你从第L支画笔到第R支画笔中共有几种不同 ...

  5. luogu 1903 [国家集训队]数颜色 / 维护队列 带修改莫队

    十分玄学的数据结构~ code: #include <bits/stdc++.h> #define N 1000006 #define setIO(s) freopen(s".i ...

  6. P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队

    \(\color{#0066ff}{ 题目描述 }\) 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支 ...

  7. bzoj2120 / P1903 [国家集训队]数颜色 / 维护队列(带修改莫队)

    P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队 在原有指针$(l,r)$上又添加了时间指针$t$ 贴一段dalao的解释 带修改的莫队,和原版莫队相比,多了一个时间轴 原版莫队是将区间( ...

  8. 洛谷 P1903 [国家集训队]数颜色 解题报告

    P1903 [国家集训队]数颜色 题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1.Q L R代表询问你从第\(L\) ...

  9. ●洛谷P1903 [国家集训队]数颜色

    题链: https://www.luogu.org/problemnew/show/P1903题解: 序列带修莫队, 推荐博客https://www.cnblogs.com/Paul-Guderian ...

随机推荐

  1. 深入了解Netty【三】Netty概述

    1.简介 Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端. Netty是一个NIO客户端服务器框架,它支持快速.简单地开发协议服务器和客户端等网络应用程序 ...

  2. C012:颠倒显示两位数

    代码: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int original; do{ printf(&q ...

  3. springcloudalibaba与nacos服务注册流程图

    springboot + springcloud + springcloudalibaba + nacos 服务注册流程图: springboot ①WebApplicationContext ②st ...

  4. 关于Vue的那些事儿

    Vue 渐进式框架 众前端周知,Vue是一套用于构建用户界面的渐进式框架,自底向上逐层应用,关注视图层.那我们就来说道说道: 渐进式:声明式渲染->组件系统->客户端路由(router)- ...

  5. if __name__ == ‘__main__‘

    if __name__ == '__main__': def_test() 作为程序的入口,当函数被调用时会从此处开始运行 如被导入的模块内没写 if __name__ == '__main__',则 ...

  6. oracle之二实例管理及数据库的启动/关闭

    实例管理及数据库的启动/关闭   2.1 实例和参数文件 1.instance 功能:用于管理和访问database.instance在启动阶段读取初始化参数文件(init parameter fil ...

  7. 踩坑了,JDK8中HashMap依然会死循环!

    是否你听说过JDK8之后HashMap已经解决的扩容死循环的问题,虽然HashMap依然说线程不安全,但是不会造成服务器load飙升的问题. 然而事实并非如此.少年可曾了解一种红黑树成环的场景,=v= ...

  8. C#开发PACS医学影像处理系统(十七):2D处理之影像旋转和翻转

    1.任意角度旋转 在XAML设计器中,设置RotateTransform属性 <InkCanvas x:Name="ToolInkCanvas" UseCustomCurso ...

  9. 分布式系统监视zabbix讲解三之用户和用户组

    概述 Zabbix 中的所有用户都通过 Web 前端去访问 Zabbix 应用程序.并为每个用户分配唯一的登陆名和密码. 所有用户的密码都被加密并储存于 Zabbix 数据库中.用户不能使用其用户名和 ...

  10. java虚拟机小贴士之GC分析

    打印日志 通过加入 -XX:+PrintGCDetails 参数则可以打印详细GC信息至控制台.参数-verbose:gc也是可以,但不够详细.通过加入-XX:+PrintGCDateStamps则可 ...