洛谷 P1903 [国家集训队]数颜色 / 维护队列 带修莫队
题目描述
墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会向你发布如下指令:
\(1\)、 \(Q\) \(L\) \(R\)代表询问你从第\(L\)支画笔到第\(R\)支画笔中共有几种不同颜色的画笔。
\(2\)、 \(R\) \(P\) \(Col\) 把第\(P\)支画笔替换为颜色\(Col\)。
为了满足墨墨的要求,你知道你需要干什么了吗?
输入格式
第\(1\)行两个整数\(N\),\(M\),分别代表初始画笔的数量以及墨墨会做的事情的个数。
第\(2\)行\(N\)个整数,分别代表初始画笔排中第\(i\)支画笔的颜色。
第\(3\)行到第\(2+M\)行,每行分别代表墨墨会做的一件事情,格式见题干部分。
输出格式
对于每一个\(Query\)的询问,你需要在对应的行中给出一个数字,代表第\(L\)支画笔到第\(R\)支画笔中共有几种不同颜色的画笔。
输入输出样例
输入 #1
6 5
1 2 3 4 5 5
Q 1 4
Q 2 6
R 1 2
Q 1 4
Q 2 6
输出 #1
4
4
3
4
说明/提示
对于\(30\%\)的数据,\(n,m \leq 10000\)
对于\(60\%\)的数据,\(n,m \leq 50000\)
对于所有数据,\(n,m \leq 133333\)
所有的输入数据中出现的所有整数均大于等于\(1\)且不超过\(10^6\)。
本题可能轻微卡常数
分析
带修改操作的莫队,比普通的莫队多了一维时间的限制
此时我们的块长需要调整至 \(n^{\frac{2}{3}}\)
排序时:
第一关键字:左端点所在块编号,从小到大排序
第二关键字:右端点所在块编号,从小到大排序
第三关键字:经历的修改次数。也可以说是询问的先后,先询问的排前面
代码
#include<cstdio>
#include<cmath>
#include<algorithm>
#define rg register
inline int read(){
rg int x=0,fh=1;
rg char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') fh=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*fh;
}
const int maxn=150000,maxm=1e6+5;
struct asd{
int l,r,c,id;
asd(){}
asd(int aa,int bb,int cc,int dd){
l=aa,r=bb,c=cc,id=dd;
}
}b[maxn];
int n,m,a[maxn],shuyu[maxn],q[maxn][3],cnt1,cnt2,d[maxn],blo,sum[maxm],ans[maxn],tot;
char s[10];
bool cmp(asd aa,asd bb){
if(shuyu[aa.l]==shuyu[bb.l] && shuyu[aa.r]==shuyu[bb.r]){
return aa.id<bb.id;
} else if(shuyu[aa.l]==shuyu[bb.l]){
if(shuyu[aa.l]&1) return aa.r<bb.r;
else return aa.r>bb.r;
} else {
return aa.l<bb.l;
}
};
inline void xg(int now,int op){
if(sum[now]==0) tot++;
sum[now]+=op;
if(sum[now]==0) tot--;
}
int main(){
n=read(),m=read();
blo=pow(n,(double)2/(double)3);
for(rg int i=1;i<=n;i++){
a[i]=read();
d[i]=a[i];
shuyu[i]=(i-1)/blo+1;
}
rg int aa,bb;
for(rg int i=1;i<=m;i++){
scanf("%s",s+1);
aa=read(),bb=read();
if(s[1]=='Q'){
cnt1++;
b[cnt1]=asd(aa,bb,cnt2,cnt1);
} else {
cnt2++;
q[cnt2][0]=aa,q[cnt2][1]=d[aa],q[cnt2][2]=bb;
d[aa]=bb;
}
}
std::sort(b+1,b+1+cnt1,cmp);
rg int l=1,r=0,lat=0;
for(rg int i=1;i<=cnt1;i++){
while(lat<b[i].c){
lat++;
if(l<=q[lat][0] && r>=q[lat][0]){
xg(q[lat][1],-1);
xg(q[lat][2],1);
}
a[q[lat][0]]=q[lat][2];
}
while(lat>b[i].c){
if(l<=q[lat][0] && r>=q[lat][0]){
xg(q[lat][2],-1);
xg(q[lat][1],1);
}
a[q[lat][0]]=q[lat][1];
lat--;
}
while(l>b[i].l){
l--;
xg(a[l],1);
}
while(r<b[i].r){
r++;
xg(a[r],1);
}
while(l<b[i].l){
xg(a[l],-1);
l++;
}
while(r>b[i].r){
xg(a[r],-1);
r--;
}
ans[b[i].id]=tot;
}
for(rg int i=1;i<=cnt1;i++){
printf("%d\n",ans[i]);
}
return 0;
}
洛谷 P1903 [国家集训队]数颜色 / 维护队列 带修莫队的更多相关文章
- Luogu P1903 [国家集训队]数颜色 / 维护队列 (带修莫队)
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...
- P1903 [国家集训队]数颜色 / 维护队列 带修改莫队
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...
- 洛谷P1903 [国家集训队]数颜色 / 维护队列 ( 带 修 )
题意:有两种操作: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col. 对每个1操作 输出答案: 带修莫队 模板题 (加 ...
- 洛谷 P1903 [国家集训队]数颜色 / 维护队列
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. \(Q\) \(L\) \(R\) 代表询问你从第L支画笔到第R支画笔中共有几种不同 ...
- 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支 ...
- bzoj2120 / P1903 [国家集训队]数颜色 / 维护队列(带修改莫队)
P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队 在原有指针$(l,r)$上又添加了时间指针$t$ 贴一段dalao的解释 带修改的莫队,和原版莫队相比,多了一个时间轴 原版莫队是将区间( ...
- 洛谷 P1903 [国家集训队]数颜色 解题报告
P1903 [国家集训队]数颜色 题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1.Q L R代表询问你从第\(L\) ...
- ●洛谷P1903 [国家集训队]数颜色
题链: https://www.luogu.org/problemnew/show/P1903题解: 序列带修莫队, 推荐博客https://www.cnblogs.com/Paul-Guderian ...
随机推荐
- qdu-小明的贪心题(最短路+最短路的数量 )
Description 小明来到青岛上学已经一年了,他给青岛这座城市画了一张地图.在这个地图上有n个点,小明的起始点为1号点,终点为n号点,并且地图上的所有边都是单向的.小明知道从i号点到j号点的时间 ...
- 1. Error running ...: No jdk for module ... 2.
一.错误 Error running ...: No jdk for module ... Error running ...: No jdk for module ... 二.解决方法 找到File ...
- 谈谈 mysql和oracle的使用感受 -- 差异
之前一直使用mysql作为存储数据库,虽然中间偶尔使用sqlite作为本地数据库存储,但没有感觉多少差别. 后来遇上了oracle,且以其作为主要存储,这下就不得不好好了解其东西了.oracle作为商 ...
- Dos拒绝服务Syn-Flood泛洪攻击--Smurf 攻击(一)
Dos拒绝服务利用程序漏洞或一对一资源耗尽的Denial of Service 拒绝服务DDos 分布式拒绝服务 多对一 Syn-Flood泛洪攻击 发送syn包欺骗服务器建立半连接 攻击代码,利用s ...
- Django设置前端背景图片
设置 setting.py 文件 STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static&qu ...
- 初等函数——指数函数(Exponential Function)
一般地,函数叫做指数函数,其中x是自变量,函数的定义域是R.
- 常用的Websocket技术一览
1. 前言 Websocket是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据 ...
- 云计算openstack共享组件——Memcache 缓存系统(4)
一.缓存系统 一.静态web页面: 1.在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Request),告 ...
- Java基础语法(10)-面向对象之三大特征
title: Java基础语法(9)-面向对象之类的成员 blog: CSDN data: Java学习路线及视频 1.面向对象特征--封装 为什么需要封装?封装的作用和含义? 我要用洗衣机,只需要按 ...
- hystrix讲解:熔断降级隔离以及合并请求
对springcloud只是学习了基本的框架搭建,基本上看到的例子都是只使用了fallback 但是hystrix还有线程隔离和请求合并的能力 顺便吐槽 大部分人的博客例子估计都是听课的 应用 ...