思路

带修莫队的板子

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

排序的时候如果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. [Codeforces Round #507][Codeforces 1039C/1040E. Network Safety]

    题目链接:1039C - Network Safety/1040E - Network Safety 题目大意:不得不说这场比赛的题面真的是又臭又长...... 有n个点,m条边,每个点有对应的权值c ...

  2. mybatis05--多条件的查询

    public interface StudentDao { /** * 前台的表单给出的查询条件不能封装成一个对象的时候 * 查询只能是多个参数了! 也就是参数不全是Student中的属性! * 这时 ...

  3. java导入、导出Excel文件

    一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际 ...

  4. 11 vs2015 连接oracle 11g 数据库及相关问题

    1.下载Oracle Developer Tools for Visual Studio 2015 ,网址如下. http://www.oracle.com/technetwork/topics/do ...

  5. ApplicaitionContext妙用request解耦合

    本文记录一个web应用中,如果要获取request对象怎么获取,本次主要思考来自看到上次文件必须把request对象放进service层导致的疑问,然后学习总结之. 第一,也是我们最常用的,在cont ...

  6. python的time

    有时候需要获取并格式化输出把当前时间,需要用到datetime的strftime方法 >>from datetime import datetime >>datetime.no ...

  7. 浅谈提高Django性能

    Django性能优化是一件困难的事情,但是也不常常如此: 下面4步将能够轻松的提高你的网站的性能,它们非常简单你应该将它们 作为标配. 持久化数据库连接 django1.6以后已经内置了数据库持久化连 ...

  8. CH 2401 - 送礼 - [折半DFS+二分]

    题目链接:传送门 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了.某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_-b) ...

  9. GAN (Generative Adversarial Network)

    https://www.bilibili.com/video/av9770302/?p=15 前面说了auto-encoder,VAE可以用于生成 VAE的问题, AE的训练是让输入输出尽可能的接近, ...

  10. js数组代码库

    1 数组操作 1.1 数组去重:ES6的方法 //ES6新增的Set数据结构,类似于数组,但是里面的元素都是唯一的 ,其构造函数可以接受一个数组作为参数 //let arr=[1,2,1,2,6,3, ...