Luogu P1903 [国家集训队]数颜色 / 维护队列 (带修莫队)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#define R(a,b,c) for( register int (a) = (b); (a) <= (c); ++(a))
#define nR(a,b,c) for( register int (a) = (b); (a) >= (c); --(a))
#define Max(a,b) ((a) >= (b) ? (a) : (b))
#define Min(a,b) ((a) <= (b) ? (a) : (b))
#define Iv inline void
#define Ii inline int
#define Il inline long long
#define ll long long
#define re register
struct ios{
template <typename ATP> inline ios& operator >> (ATP &x) {
x=0; int f=1; char c;
for (c=getchar(); c<'0' || c>'9'; c=getchar()) if(c == '-') f=-1;
while (c >= '0' && c <= '9') x = x * 10 + (c ^ '0'), c=getchar();
x*=f;
return *this;
}
template <typename ATP> inline ios& operator << (ATP x) {
int digit = 0; char sch[67];
if( x == 0) { putchar ('0'); return *this;}
if (x < 0) { x = -x, putchar ('-');}
while (x) sch[++digit]=x % 10 ^ '0', x /= 10;
for (register int i=digit; i; --i) putchar (sch[i]);
return *this;
}
} io;
using namespace std;
//#define InputAndOutput_Bug_Test
#ifdef InputAndOutput_Bug_Test
int main(){
while (1) {
long long x;
io >> x;
cout << x << endl;
io << x;
putchar ('\n');
}
}
#endif
const int N=50007;
int col[N];
int TotColor[1000007],NowColor[N];
int block[N];
int ans[N],Ans;
int l=1,r;
struct Query{
int l,r,tim,id;
bool operator< (const Query &b)const{
if(block[l]==block[b.l]){
if(block[r]==block[b.r])
return tim<b.tim;
else
return r<b.r;
}
else
return l<b.l;
}
}q[N];
struct Change{
int pos,New,Old;
}c[N];
Iv Modify(int workColor,int d){
TotColor[workColor]+=d;
if(d>0)
Ans+=(TotColor[workColor]==1);
if(d<0)
Ans-=(TotColor[workColor]==0);
}
Iv Going(int pos,int workColor){
if(l<=pos&&pos<=r){
Modify(workColor,1),
Modify(col[pos],-1);
}
col[pos]=workColor;
}
int main(){
int n,m; io>>n>>m;
int unit=pow(n,0.666666);
R(i,1,n){
io>>col[i],
NowColor[i]=col[i],
block[i]=(i-1)/unit+1;
}
int tot=0,Time=0;
R(i,1,m){
char opt;
for(opt=getchar();opt!='Q'&&opt!='R';opt=getchar());
if(opt=='Q'){
int l,r;
io>>l>>r,
q[++tot]=(Query){l,r,Time,tot};
}
else{
int pos,newColor;
io>>pos>>newColor,
c[++Time]=(Change){pos,newColor,NowColor[pos]},
NowColor[pos]=newColor;
}
}
sort(q+1,q+tot+1);
Time=0;
R(i,1,tot){
while(Time<q[i].tim) Going(c[Time+1].pos,c[Time+1].New),++Time;
while(Time>q[i].tim) Going(c[Time].pos,c[Time].Old),--Time;
while(l<q[i].l) Modify(col[l],-1),++l;
while(l>q[i].l) Modify(col[l-1],1),--l;
while(r<q[i].r) Modify(col[r+1],1),++r;
while(r>q[i].r) Modify(col[r],-1),--r;
ans[q[i].id]=Ans;
}
R(i,1,tot){
io<<ans[i],
putchar('\n');
}
return 0;
}
Luogu P1903 [国家集训队]数颜色 / 维护队列 (带修莫队)的更多相关文章
- 洛谷 P1903 [国家集训队]数颜色 / 维护队列 带修莫队
题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: \(1\). \(Q\) \(L\) \(R\)代表询问你从第\(L\) ...
- P1903 [国家集训队]数颜色 / 维护队列 带修改莫队
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...
- luogu 1903 [国家集训队]数颜色 / 维护队列 带修改莫队
十分玄学的数据结构~ code: #include <bits/stdc++.h> #define N 1000006 #define setIO(s) freopen(s".i ...
- P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队
\(\color{#0066ff}{ 题目描述 }\) 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支 ...
- LUOGU P1903 [国家集训队]数颜色 / 维护队列
传送门 解题思路 带修莫队,第一次写,其实和普通莫队差不多,就是多了个时间轴,块分n^(2/3)最优,时间复杂度O(n^(5/3)). #include<iostream> #includ ...
- bzoj2120 / P1903 [国家集训队]数颜色 / 维护队列(带修改莫队)
P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队 在原有指针$(l,r)$上又添加了时间指针$t$ 贴一段dalao的解释 带修改的莫队,和原版莫队相比,多了一个时间轴 原版莫队是将区间( ...
- P1903 [国家集训队]数颜色 / 维护队列
思路 带修莫队的板子 带修莫队只需要多维护一个时间的指针即可,记录一下每个询问在第几次修改之后,再回退或者前进几个修改操作 排序的时候如果a.l和b.l在一个块里,就看r,如果a.r和b.r在一个块里 ...
- P1903 [国家集训队]数颜色 / 维护队列(带修莫队)
题目描述: 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. ...
- 洛谷P1903 [国家集训队]数颜色 / 维护队列 ( 带 修 )
题意:有两种操作: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col. 对每个1操作 输出答案: 带修莫队 模板题 (加 ...
随机推荐
- MASA Auth - 权限设计
权限术语 Subject:用户,用户组 Action:对Object的操作,如增删改查等 Object:权限作用的对象,也可以理解为资源 Effect:规则的作用,如允许,拒绝 Condition:生 ...
- Python <算法思想集结>之抽丝剥茧聊动态规划
1. 概述 动态规划算法应用非常之广泛. 对于算法学习者而言,不跨过动态规划这道门,不算真正了解算法. 初接触动态规划者,理解其思想精髓会存在一定的难度,本文将通过一个案例,抽丝剥茧般和大家聊聊动态规 ...
- Docker打包镜像并上传
Docker打包镜像并上传 登录 账号 docker login --username=yourusername 密码 yourPassword 推送到仓库 docker镜像打标签 docker ta ...
- 优先队列STL
引入 优先队列是一种特殊的队列,它的功能是--自动排序. 基本操作: q.size(); //返回q里元素个数 q.empty(); //返回q是否为空,空则返回1,否则返回0 q.push(k); ...
- SQL语句修改MySQL用户密码
SQL语句修改MySQL用户密码 前言 上数据库安全实验课,用命令行和DataGrip试图修改用户密码,一直语法报错.最后用Navicat才修改成功,预览Navicat的SQL语句,发现语句和网上都不 ...
- 入坑KeePass(四)KeePass通过坚果云WebDav同步方法
参考博客:什么值得买平台-Keepass+坚果云:多平台密码无缝同步 .1.在坚果云上创建一个同步专用的文件夹(建议勾上"默认不同步到电脑"选项) 创建之后可以把刚才创建的数据库文 ...
- html实现3d视觉特效
<html> <head> <title>HTML5实现3D球效果</title> <style type="text/css" ...
- 一文带你搞懂 JWT 常见概念 & 优缺点
在 JWT 基本概念详解这篇文章中,我介绍了: 什么是 JWT? JWT 由哪些部分组成? 如何基于 JWT 进行身份验证? JWT 如何防止 Token 被篡改? 如何加强 JWT 的安全性? 这篇 ...
- .NetCore实现图片缩放与裁剪 - 基于ImageSharp
前言 (突然发现断更有段时间了 最近在做博客的时候,需要实现一个类似Lorempixel.LoremPicsum这样的随机图片功能,图片有了,还需要一个根据输入的宽度高度获取图片的功能,由于之前处理图 ...
- JS:表达式
js代码的形式: 1.直接量 2.表达式 3.语句 1; "a"; true; null; var a; function fn(){}; b; var c = 20; var f ...