洛谷 P1903 [国家集训队]数颜色 / 维护队列 带修莫队
题目描述
墨墨购买了一套\(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 [国家集训队]数颜色 / 维护队列 带修莫队的更多相关文章
- Luogu P1903 [国家集训队]数颜色 / 维护队列 (带修莫队)
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...
- P1903 [国家集训队]数颜色 / 维护队列 带修改莫队
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...
- 洛谷P1903 [国家集训队]数颜色 / 维护队列 ( 带 修 )
题意:有两种操作: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col. 对每个1操作 输出答案: 带修莫队 模板题 (加 ...
- 洛谷 P1903 [国家集训队]数颜色 / 维护队列
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. \(Q\) \(L\) \(R\) 代表询问你从第L支画笔到第R支画笔中共有几种不同 ...
- luogu 1903 [国家集训队]数颜色 / 维护队列 带修改莫队
十分玄学的数据结构~ code: #include <bits/stdc++.h> #define N 1000006 #define setIO(s) freopen(s".i ...
- P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队
\(\color{#0066ff}{ 题目描述 }\) 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支 ...
- bzoj2120 / P1903 [国家集训队]数颜色 / 维护队列(带修改莫队)
P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队 在原有指针$(l,r)$上又添加了时间指针$t$ 贴一段dalao的解释 带修改的莫队,和原版莫队相比,多了一个时间轴 原版莫队是将区间( ...
- 洛谷 P1903 [国家集训队]数颜色 解题报告
P1903 [国家集训队]数颜色 题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1.Q L R代表询问你从第\(L\) ...
- ●洛谷P1903 [国家集训队]数颜色
题链: https://www.luogu.org/problemnew/show/P1903题解: 序列带修莫队, 推荐博客https://www.cnblogs.com/Paul-Guderian ...
随机推荐
- 1008 Elevator (20 分)(模拟)
The highest building in our city has only one elevator. A request list is made up with N positive nu ...
- OpenvSwitch系列之八 vxlan隧道
Open vSwitch系列之一 Open vSwitch诞生 Open vSwitch系列之二 安装指定版本ovs Open vSwitch系列之三 ovs-vsctl命令使用 Open vSwit ...
- mysql排序的问题与获取第几高的分数的信息
1:先截图看效果 2:完整的SQl语句 SELECT * FROM studentscore; -- ------------------ SET @maxscore=(SELECT MAX(scor ...
- 区间查询与等效minus查询
--表结构 create table hy_emp( id number(4,0) primary key, name nvarchar2(20) not null, edate date) --充值 ...
- 使用Built-in formatting来创建log字符串
在一次哦测试中,sonar-qube总是报Use the built-in formatting to contruct this argument, 在网上查了一下,原来它是推荐这样做: log.i ...
- Oracle Rman备份恢复和管理
参考资料: Oracle之Rman入门指南 一步一步学Rman Rman简介 Rman-Recover manager恢复管理工具. Oracle集成了很多环境的一个数据库备份和恢复的工具. Rman ...
- ios网络访问官方演示程序
官方演示程序 AppDelegate 设置缓存 NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * ...
- 我的Python自学之路-003 字符串的知识
'''字符串是以引号或者单引号括起来的任意文本,例如"123","asdfjk",'adfa'引号或者单引号,只是一种表示方法,并不是字符串的一部分如果字符串本 ...
- 分布式系统监视zabbix讲解二之邮件报警通知
概述 在上一篇博客<分布式系统监视zabbix讲解一技术流ken>中已经详细讲解了如何安装zabbix,本篇博客将详细讲解如何使用zabbix监控另外一台主机,并实现email报警通知机制 ...
- 虚拟机系列 | JVM特点,基础结构与执行周期
本文源码:GitHub·点这里 || GitEE·点这里 一.虚拟机简介 1.虚拟机概念 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整 ...