P1903 [国家集训队]数颜色 / 维护队列
思路
带修莫队的板子
带修莫队只需要多维护一个时间的指针即可,记录一下每个询问在第几次修改之后,再回退或者前进几个修改操作
排序的时候如果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 [国家集训队]数颜色 / 维护队列的更多相关文章
- bzoj2120 / P1903 [国家集训队]数颜色 / 维护队列(带修改莫队)
P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队 在原有指针$(l,r)$上又添加了时间指针$t$ 贴一段dalao的解释 带修改的莫队,和原版莫队相比,多了一个时间轴 原版莫队是将区间( ...
- P1903 [国家集训队]数颜色 / 维护队列(莫队区间询问+单点修改)
题目链接:https://www.luogu.org/problemnew/show/P1903 题目大意:中文题目 具体思路:莫队单点修改+区间询问模板题,在原来的区间询问的基础上,我们要记录当前这 ...
- 洛谷 P1903 [国家集训队]数颜色 / 维护队列
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. \(Q\) \(L\) \(R\) 代表询问你从第L支画笔到第R支画笔中共有几种不同 ...
- P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队
\(\color{#0066ff}{ 题目描述 }\) 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支 ...
- P1903 [国家集训队]数颜色 / 维护队列(带修莫队)
题目描述: 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. ...
- 洛谷P1903 [国家集训队]数颜色 / 维护队列 ( 带 修 )
题意:有两种操作: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col. 对每个1操作 输出答案: 带修莫队 模板题 (加 ...
- 洛谷 P1903 [国家集训队]数颜色 / 维护队列 带修莫队
题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: \(1\). \(Q\) \(L\) \(R\)代表询问你从第\(L\) ...
- P1903 [国家集训队]数颜色 / 维护队列 带修改莫队
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...
- LUOGU P1903 [国家集训队]数颜色 / 维护队列
传送门 解题思路 带修莫队,第一次写,其实和普通莫队差不多,就是多了个时间轴,块分n^(2/3)最优,时间复杂度O(n^(5/3)). #include<iostream> #includ ...
随机推荐
- 查看 java 中的编译的字节码文件
javap -c Atomicity ---------- javap -c 产生的字节码文件---------- Compiled from "Atomicity.java" p ...
- python全栈开发 * 进程之间的通信,进程之间数据共享 * 180726
进程之间的通信(IPC)队列和管道一.队列 基于管道实现 管道 + 锁 数据安全(一).队列 队列遵循先进先出原则(FIFO) 多用于维护秩序,买票,秒杀 队列的所有方法: put()(给队列里添加数 ...
- 基于bootstrap-treeview做的一个漂亮的无限分类树层级联动菜单
2017年12月11日09:59:15 因为工作需要把原来的bootstrap-treeview做了一些小改动,方便后台开发人员使用 最终效果,看起来还行,但是其实不是特别友好对用户来说,但是对开发者 ...
- 自定制property
class Lazyproperty: def __init__(self, func): self.func = func def __get__(self, instance, owner): p ...
- 洛谷试炼场 - 关卡2-1 - 简单的模拟 - (Done)
最近这段时间感冒外加一些乱七八糟的事情,导致脑子严重僵化……只好刷刷基础(水)题巩固巩固基础(混混题数). 目录 P1003 铺地毯 P1067 多项式输出 P1540 机器翻译 P1056 排座椅 ...
- 【摘】Fiddler工具使用介绍
摘自:https://www.cnblogs.com/miantest/p/7289694.html Fiddler基础知识 Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作 ...
- 腾讯云主机及CentOS7.2简单上手体验
前段时间拜读了崔庆才老师的<Python③网络爬虫开发实战>受益良多,对于初学爬虫的新手来说,本书真可谓是通俗易懂,非常适合新手入门.但是受制于没有服务器环境,书中很多例子难以模拟!最近正 ...
- Tomcat服务安全加固
Tomcat服务默认启用了管理后台功能,使用该后台可直接上传 war 文件包对站点进行部署和管理.由于运维人员的疏忽,可能导致管理后台存在空口令或者弱口令的漏洞,使得黑客或者不法分子可以利用该漏洞直接 ...
- 2018-2019-1 20189203《Linux内核原理与分析》第八周作业
第一部分 课本学习 ELF文件(目标文件)格式主要三种: 1)可重定向文件:文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件.(目标文件或者静态库文件,即 ...
- 深入理解Java虚拟机6-chap8-9-斗者3星
一.虚拟机字节码执行引擎 1.虚拟机执行引擎由自己实现,所以可以自行制定指令集与执行引擎的体系结构,并且可以执行那些不被硬件直接支持的指令集格式. 2.执行引擎 编译执行:通过JIT编译器产生本地代码 ...