洛谷 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 ...
随机推荐
- POJ-3255-Roadblocks(次短路的另一种求法)
Bessie has moved to a small farm and sometimes enjoys returning to visit one of her best friends. Sh ...
- Tomcat之如何自己做一个tomcat
来源:<How Tomcat Works> Servlet容器的工作原理: 1.创建一个request对象并填充那些有可能被所引用的servlet使用的信息,比如参数.头部.cookies ...
- RPC之总体架构
要完成一个高可用.高性能的RPC框架,需要对其架构的设计进行梳理,这里参考xxl-rpc框架,对整个项目进行梳理. 以上就是项目的整个构架,分为四个部分: 第一个是服务发布与引入,基于JDK动态代理以 ...
- log4j日志文件输出保存
og4j.appender.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.File=app.log log4j.appe ...
- intellij idea 无法进行调试的解决方案
inteliij idea 如果出现无法调试该怎样做?debug中各功能为灰色. 如果你用的是外来项目,可能是没有添加这个项目自带的library: 解决办法: 在file->project ...
- java中整型、浮点型、char型扩展
怎么区分是什么进制? 二进制:0b开头,eg: int i = 0b10; 八进制:0开头,eg: int k = 010; 十进制: 十六进制:0x开头,eg: int j = 0x10; 浮点数类 ...
- 菜鸟电子面单对接技术方案(link)
一.背景 快递业务日新月异,收发快递是生活中不可缺少的一部分了,特别是做微商的商家,每天发送大量的快递.填写快递单已经成为过去式,快递小哥上门收件的时候,都使用手持的中端设备,再也不用客户填写快递单了 ...
- jmeter连接redis取数据
1.导入fastjson-1.2.2.jar.jedis-2.2.1.jar到 jmeter\lib\ext\ 下 2.新建BeanShell Sampler import com.alibaba.f ...
- 故事:坐在我隔壁的小王问我什么是HyperLogLog
1 最近坐我隔壁的小王同志,心情真是糟透了.不但工作不顺心,被老板狠狠的批了一顿,连女朋友也跟别人跑了(Y 的让你天天在我面前秀). 真是不可谓不惨,我都快要同情他了. 看着他萎靡又迷离的眼神,我实在 ...
- [LeetCode]287. 寻找重复数(二分)
题目 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数. 示例 1: 输入: [ ...