思路

带修莫队的板子

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

排序的时候如果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. nvm的安装

    安装前可先卸载原来的node, npm, 安装成功后,可用nvm装node 一.用nvm-noinstall.zip安装 1.nvm-windows 下载 https://github.com/cor ...

  2. WINDOWS自带md5校验工具

    WINDOWS自带的工具certutil.exe,   certutil -hashfile chropp.exe MD5; 就可以了

  3. C#实现全窗体范围拖动

    using System.Runtime.InteropServices; [DllImport("user32.dll")] public static extern bool ...

  4. Luogu 1093 - 奖学金 - [排序水题]

    题目链接:https://www.luogu.org/problemnew/show/P1093 题目描述某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生 ...

  5. Jmeter学习之-http接口功能测试-入门

    ps:默认已经安装好Jmeter工具,配置好相关环境 打开jmeter 工具,为测试计划重新命名 添加线程组:在测试计划上右键,依次选择“添加>Threads>线程组” 添加http请求: ...

  6. JavaWeb & Tomcat

    1 JavaWeb概述 Java在服务器端的应用有Servlet,JSP和第三方框架等. Java的Web框架基本都遵循特定的路数:使用Servlet或者Filter拦截请求,使用MVC的思想设计架构 ...

  7. python使用MySQLdb实现连接数据库Mysql

    python实现连接数据库mysql的步骤: 一.引入MySQLdb 二.获取与数据库的连接 三.执行SQL语句和存储过程 四.关闭数据库连接 1.什么是MySQLdb? MySQLdb是用于pyth ...

  8. python基础(17)-IO模型&selector模块

    先说一下IO发生时涉及的对象和步骤.对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(k ...

  9. 开源搜素引擎:Lucene、Solr、Elasticsearch、Sphinx优劣势比较

    https://blog.csdn.net/belalds/article/details/82667692 开源搜索引擎分类 1.Lucene系搜索引擎,java开发,包括: Lucene Solr ...

  10. HBase笔记6 过滤器

    过滤器 过滤器是GET或者SCAN时过滤结果用的,相当于SQL的where语句 HBase中的过滤器创建后会被序列化,然后分发到各个region server中,region server会还原过滤器 ...