思路

带修莫队的板子

带修莫队只需要多维护一个时间的指针即可,记录一下每个询问在第几次修改之后,再回退或者前进几个修改操作

排序的时候如果a.l和b.l在一个块里,就看r,如果a.r和b.r在一个块里,就看t

然后块的大小\(O(n^{\frac{2}{3} })\)最优,时间复杂度是\(O(n^{\frac{5}{3}})\)

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
struct Oper{
int pos,from,to;
}M[50010];
struct Ask{
int l,r,tim,id;
}Q[50010];
int L,R,T,barrel[1000100],ans,arr[50010],a[50010];
int n,m,siz,num,be[50010],out[50010];
bool cmp(Ask a,Ask b){
return ((be[a.l]==be[b.l])?(be[a.r]==be[b.r]?a.tim<b.tim:be[a.r]<be[b.r]):be[a.l]<be[b.l]);
}
void going(int t,int opt){
if(opt==1){
arr[M[t].pos]=M[t].to;
if(M[t].pos>=L&&M[t].pos<=R){
barrel[M[t].from]--;
if(!barrel[M[t].from])
ans--;
if(!barrel[M[t].to])
ans++;
barrel[M[t].to]++;
}
}
else{
arr[M[t].pos]=M[t].from;
if(M[t].pos>=L&&M[t].pos<=R){
barrel[M[t].to]--;
if(!barrel[M[t].to])
ans--;
if(!barrel[M[t].from])
ans++;
barrel[M[t].from]++;
}
}
T+=opt;
}
void movel(int opt){
if(opt==1){
barrel[arr[L]]--;
if(!barrel[arr[L]])
ans--;
}
else{
if(!barrel[arr[L-1]])
ans++;
barrel[arr[L-1]]++;
}
L+=opt;
}
void mover(int opt){
if(opt==1){
if(!barrel[arr[R+1]])
ans++;
barrel[arr[R+1]]++;
}
else{
barrel[arr[R]]--;
if(!barrel[arr[R]])
ans--;
}
R+=opt;
}
void calbe(void){
siz=pow(n,0.6666666666);
num=n/siz;
if(n%siz)
num++;
for(int i=1;i<=n;i++)
be[i]=i/siz+1;
}
int main(){
scanf("%d %d",&n,&m);
int cnt=0,anscnt=0;;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),arr[i]=a[i];
L=R=T=0;
for(int i=1;i<=m;i++){
char opt=getchar();
while(opt!='R'&&opt!='Q')
opt=getchar();
if(opt=='R'){
++cnt;
scanf("%d %d",&M[cnt].pos,&M[cnt].to);
M[cnt].from=a[M[cnt].pos];
a[M[cnt].pos]=M[cnt].to;
}
else{
++anscnt;
Q[anscnt].id=anscnt;
scanf("%d %d",&Q[anscnt].l,&Q[anscnt].r);
Q[anscnt].tim=cnt;
}
}
calbe();
sort(Q+1,Q+anscnt+1,cmp);
for(int i=1;i<=anscnt;i++){
while(T<Q[i].tim)
going(T+1,1);
while(T>Q[i].tim)
going(T,-1);
while(L<Q[i].l)
movel(1);
while(L>Q[i].l)
movel(-1);
while(R<Q[i].r)
mover(1);
while(R>Q[i].r)
mover(-1);
out[Q[i].id]=ans;
}
for(int i=1;i<=anscnt;i++)
printf("%d\n",out[i]);
return 0;
}

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

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

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

  2. P1903 [国家集训队]数颜色 / 维护队列(莫队区间询问+单点修改)

    题目链接:https://www.luogu.org/problemnew/show/P1903 题目大意:中文题目 具体思路:莫队单点修改+区间询问模板题,在原来的区间询问的基础上,我们要记录当前这 ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. LUOGU P1903 [国家集训队]数颜色 / 维护队列

    传送门 解题思路 带修莫队,第一次写,其实和普通莫队差不多,就是多了个时间轴,块分n^(2/3)最优,时间复杂度O(n^(5/3)). #include<iostream> #includ ...

随机推荐

  1. adb 常用命名

    adb是Android Debug Bridge的简称, 就是起到调试桥的作用,用来操作android设备 adb help (显示帮助信息) adb devices (获取设备列表及设备状态) ad ...

  2. ArcGIS AddIN开发之 设置当前工具为Edit Tool

    在GIS数据处理中,经常需要选择要素,再进行操作.所以,为了处理的方便,可以将当前工具处理结束后,将当前工具设置为Edit Tool,以方便下一次的选择处理. 相关资料: 1.ArcMap Name ...

  3. 微信小程序开发笔记02

    今天学习了微信小程序开发用到的语言,wxml与wxss语言基本语法与html和css基本语法相似,学习起来相对简单.在小程序主要的语言是js(javascript,跟准确的说是jqery) ,由于这种 ...

  4. Oracle课程档案。第十一天

    读一致性:oracle通过多版本与闪回机制保证读一致性.保证从某个时间点开始查询是一致的.在Oracle中主要通过SCN版本号来控制系统修改的版本,典型的例子是我们可以通过在同一个查询中得到同一个对象 ...

  5. Java之事务的基本应用

    基本介绍 事务是数据一致性最基本的保证,也就是说一个事务中的操作要么都成功,要么都失败,不允许部分成功.我们常说的事务就是jdbc事务,当然Java中还有其他事务,并且在使用jdbc事务有很多注意点, ...

  6. 对象何时进入老年代、何时发生full gc

    一.对象何时进入老年代 (1)当对象首次创建时, 会放在新生代的eden区, 若没有GC的介入,会一直在eden区, GC后,是可能进入survivor区或者年老代 (2)当对象年龄达到一定的大小 , ...

  7. 万能的DBHelper帮助类

    DBHelper类: 简单的理解就是一个工具箱,我要用锤子的时候就在里面拿,我要用剪刀的时候也可以在里面拿,前提是我们写的DBHelper够不够强大! 软件中的四大功能:增.删.改.查  我们要实现这 ...

  8. freeswitch的拨号规则配置

    当一个呼叫在ROUTING状态下达到命中拨号规则解析器时,相应的拨号规则就开始解析了.随着解析的进行,在xml文件中的符合条件的或标签中的指令形成一个指令表,安装到这个通道中. 你可以将拨号规则文件放 ...

  9. (玩起来)DAX/PowerBI系列 - 参数表(Parameter Table) - 多时间段数值对比

    盆友们,边看文章边玩,请耐心等待PowerBI load出来~~~~ (7.8秒钟) DAX/PowerBI系列 - 参数表(Parameter Table) - 多时间段数值对比 难度: ★☆☆☆☆ ...

  10. Hadoop生态集群MapReduce详解

    一.概述 MapReduce是一种编程模型,这点很重要,仅仅是一种编程的模型,而不是具体的软件.在hadoop中,HDFS是分布式的文件存储系统,而MapReduce是一个分布式的计算框架.用于大规模 ...