[国家集训队] 数颜色 / 维护队列(过程看注释)

题目描述

墨墨购买了一套 NNN 支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会向你发布如下指令:

  1. QLRQ\ L\ RQ L R 代表询问你从第 LLL 支画笔到第 RRR 支画笔中共有几种不同颜色的画笔。

  2. RPColR\ P\ ColR P Col 把第 PPP 支画笔替换为颜色 ColColCol。

为了满足墨墨的要求,你知道你需要干什么了吗?

输入格式

第 111 行两个整数 NNN,MMM,分别代表初始画笔的数量以及墨墨会做的事情的个数。

第 222 行 NNN 个整数,分别代表初始画笔排中第 iii 支画笔的颜色。

第 333 行到第 2+M2+M2+M 行,每行分别代表墨墨会做的一件事情,格式见题干部分。

输出格式

对于每一个 Query 的询问,你需要在对应的行中给出一个数字,代表第 LLL 支画笔到第 RRR 支画笔中共有几种不同颜色的画笔。

样例 #1

样例输入 #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≤10000n,m \leq 10000n,m≤10000

对于60%的数据,n,m≤50000n,m \leq 50000n,m≤50000

对于所有数据,n,m≤133333n,m \leq 133333n,m≤133333

所有的输入数据中出现的所有整数均大于等于 111 且不超过 10610^6106。

本题可能轻微卡常数

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long ll;
struct modui{int l,r,t,id;
}s[N];
int n,m,a[N],c[N],d[N],pos[N],ans=0,L=1,R=0,T=0,ls=0,k;
int pre[N],nex[N],anss[N];
char ch[2];
void add(int x){if(c[x]==0) ans++;//此时为0,新增就意味着新颜色的出现c[x]++;
}
void del(int x){c[x]--;if(c[x]==0) ans--;//删掉后为0,意味着一种颜色的消失
}
bool cmp(modui &x,modui &y){//以左端点所在块为第一关键字,以右端点所在块为第二关键字//以时间为第三关键字进行排序if (pos[x.l]!=pos[y.l]) return x.l<y.l;if(pos[x.r]!=pos[y.r]) return x.r<y.r;return x.t<y.t;//都是为了加速
}
void query(int l,int r,int t,int id){//移动指针的时候,对应地去删除或添加对答案的贡献//如果当前修改数比询问的修改数少就把没修改的进行修改,反之回退while (L<l) del(a[L++]);//左指针往右移删除while (L>l) add(a[--L]);//左指针往左移加入while (R<r) add(a[++R]);//右指针往右移加入while (R>r) del(a[R--]);//右指针往左移删除while(T<t){//增加T这个修改T++;if(L<=pre[T]&&pre[T]<=R) del(a[pre[T]]);//删掉旧的d[T]=a[pre[T]];//记录下修改之前的信息,方便还原a[pre[T]]=nex[T];if(L<=pre[T]&&pre[T]<=R) add(a[pre[T]]);//改来新的}while(T>t){//回撤T这个修改if(L<=pre[T]&&pre[T]<=R) del(a[pre[T]]);//删掉多的a[pre[T]]=d[T];//回撤if(L<=pre[T]&&pre[T]<=R) add(a[pre[T]]);//还原旧的T--;}anss[id]=ans;//记录答案return;
}
int main(){cin>>n>>m;int dis=pow(n,(double)2/(double)3);//块大小 //pos标记每个数所属的分块for(int i=1;i<=n;i++) scanf("%d",&a[i]),pos[i]=i/dis;for(int i=1;i<=m;i++){scanf("%s",ch);int l,r;scanf("%d %d",&l,&r);if(ch[0]=='Q') s[++ls]=modui{l,r,k,ls};else k++,pre[k]=l,nex[k]=r;}sort(s+1,s+1+ls,cmp);for(int i=1;i<=ls;i++)  query(s[i].l,s[i].r,s[i].t,s[i].id);for(int i=1;i<=ls;i++)  printf("%d\n",anss[i]);return 0;
}

P1903 [国家集训队] 数颜色 / 维护队列相关推荐

  1. 带修莫队 ---- P1903 [国家集训队]数颜色 / 维护队列 带修莫队模板

    题目链接 题目大意: 解题思路: 带修改的莫队 首先我们要知道,普通的莫队算法是不资瓷修改操作的, 不过后人对莫队算法加以改进 发明了资瓷修改的莫队算法 思路 在进行修改操作的时候,修改操作是会对答案 ...

  2. 洛谷 P1903 [国家集训队]数颜色 / 维护队列

    题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...

  3. P1903 [国家集训队]数颜色 / 维护队列

    关于时间复杂度 对于多维莫队的复杂度差不多为\(O(n^{\frac{2k-1}{k}})\) 摘自zhihu大佬 奇偶分类优化 return a.l == b.l ? (a.l & 1) ? ...

  4. luoguP1903 [国家集训队]数颜色 / 维护队列

    带修改莫队经典题目 关于莫队的一篇很好的blog 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第 ...

  5. [国家集训队]数颜色 / 维护队列 (带修莫队模板题)

    题意: 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. ...

  6. P1903-[国家集训队]数颜色/维护队列【带修莫队】

    正题 题目链接:https://www.luogu.com.cn/problem/P1903 题目大意 要求支持两个操作 QLR:Q\ \ L\ \ R:Q  L  R:询问L,RL,RL,R之间有多 ...

  7. [国家集训队]数颜色

    [国家集训队]数颜色 题解 很水的一道带修莫队板子题. 我们只需要将操作时间看作是当前询问的第三维,排序后跑莫队即可. 三维莫队块长为n23n^{\frac{2}{3}}n32​时时间复杂度是最优的, ...

  8. Bzoj 2453: 维护队列 Bzoj 2120: 数颜色 分块,bitset

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 578  Solved: 247 [Submit][Status][Discus ...

  9. 中国最新奥数竞赛成绩出炉:南师大附中女生严彬玮满分夺冠!60人国家集训队名单公布...

    雷刚 发自 副中心  量子位 报道 | 公众号 QbitAI 第35届中国数学奥林匹克竞赛成绩公布. 同时也意味着新一届中国奥数国家集训队,正式集结. 60名中学生. 湖北贡献9人.广东7人,上海6人 ...

  10. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 9894  Solved: 4561 [Su ...

最新文章

  1. 一起学spring--spring事件机制--监听器
  2. 实现迷你解析器把字符串解析成NestInteger类 Mini Parser
  3. Flutter开发之Scaffold 脚手架的使用(39)
  4. java和python可以在一个项目中同时使用么-java调用python的几种用法(看这篇就够了)...
  5. python爬虫多进程_Python爬虫技术--基础篇--多进程
  6. UITableView (4): 在TableView中移动cell和Section 从TableView中删除cell和section 添加系统默认刷新控件...
  7. C MySql封装类 高性能连接池_在vc中通过连接池操作mysql(api方式),附c++访问mysql的封装类...
  8. serialport 延时计时器 修改_为了夜经济,青岛真是拼了!地铁公交延时运营,再也不怕没车了...
  9. 《Clean Code》 代码简洁之道
  10. 创新创业技术路线怎么写_2016如何撰写创新创业项目申请书.ppt
  11. Docker容器网络模式与数据管理
  12. Mirai僵尸网络介绍以及源码
  13. TestNG使用教程
  14. Autocad 2022版本插件开发基础1
  15. 快速接入 微信微博QQ钉钉 原生登录分享
  16. 基于STM32F103的步进电机S型曲线加减速算法与实现
  17. 蓝牙鼠标卡顿,蓝牙与wifi冲突解决方式
  18. C语言——数组定义及用法
  19. 二叉树中序遍历的非递归算法
  20. 如何让笔记获得更多曝光量?小红书曝光机制是怎样的

热门文章

  1. PDF怎么转图片格式?分享三个不错的方法
  2. Hibernate中evict方法和clear方法说明
  3. 一个好用的hibernate泛型dao
  4. ubuntu1604 golang环境
  5. lenovo启动热键_联想笔记本进bios按什么键|联想笔记本开机进入bios热键是哪个
  6. 最小割集stoer_wagner算法
  7. Win 开机自动启动 WSL 服务
  8. SQLServer数据库文件压缩
  9. Ubuntu下kdiff3的使用
  10. 40163 php,【PHP】微信支付JsApi 40163错误