思路

带修莫队的板子

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

排序的时候如果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. plsql中文乱码

    一.关于PLSQL无法正确显示中文 刚才下载安装了PLSQL Developer 9.0.0.1601 汉化绿色版,执行SQL查询语句,发现显示的数据中只要有中文都会以?表示. 原因:客户端跟服务器的 ...

  2. macOS Sierra上面的php开发环境安装

    本文参考资料: 启动apache时,解决  How to Fix AH00558 and AH00557 httpd apr_sockaddr_info_get() Error Message     ...

  3. 使用Bitsadmin 命令下载文件

    如果你碰到一个 Sa权限的注入点,你可以执行dos命令,但是你发现站库分离,数据库和web不在一个服务器上,而且悲剧的是数据库服务器又是个内网,这个时候你该怎么办? 这里就需要用到Bitsadmin来 ...

  4. 四、XML语言学习(2)

    XML约束之DTD 1.XML都是用户自定义标签,若出现小小的错误,软件程序将不能正确地获取文件中的内容而报错.XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为约束格式良好的X ...

  5. js设计模式(六)---命令模式

    命令模式算是最简单.优雅的模式之一了,命令模式中的命令指的是一个执行某些特定事情的指令.目的是吧请求发送者和请求接受者解耦, 就像点餐,顾客只需要发送菜单,谁去接收,不用考虑.厨师接收到命令开始做菜, ...

  6. 微信小游戏跳一跳简单手动外挂(基于adb 和 python)

    只有两个python文件,代码很简单. shell.py: #coding:utf-8 import subprocess import math import os def execute_comm ...

  7. etcd集群的搭建

    由于最近在学习kubernetes,etcd作为kubernetes集群的主数据库,必须先启动. etcds实例名称 IP地址 Hostname etcd 1 192.168.142.161 kube ...

  8. iOS 如果页面 A 跳转到 页面 B,A 的 viewDidDisappear 方法和 B 的 viewDidAppear 方法哪个先调用?

    如果页面 A 跳转到 页面 B,A 的 viewDidDisappear 方法和 B 的 viewDidAppear 方法哪个先调用? 1. - (void)pushViewController:(U ...

  9. 2014西安赛区C题

    将A[i]同他后面比他小的建边,然后求最大密度子图 #include <iostream> #include <algorithm> #include <string.h ...

  10. angular+webpack(二)

    上篇文章Angular2开发基础之TSC编译 解决如何使用TSC来编译ng2项目,以及如何解决出现的error.这些点是新手容易忽视的内容, 要熟悉ng开发的工具链,还是需要掌握其中的重点.本篇文章是 ...