P1903 [国家集训队] 数颜色 / 维护队列
[国家集训队] 数颜色 / 维护队列(过程看注释)
题目描述
墨墨购买了一套 NNN 支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会向你发布如下指令:
QLRQ\ L\ RQ L R 代表询问你从第 LLL 支画笔到第 RRR 支画笔中共有几种不同颜色的画笔。
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 [国家集训队] 数颜色 / 维护队列相关推荐
- 带修莫队 ---- P1903 [国家集训队]数颜色 / 维护队列 带修莫队模板
题目链接 题目大意: 解题思路: 带修改的莫队 首先我们要知道,普通的莫队算法是不资瓷修改操作的, 不过后人对莫队算法加以改进 发明了资瓷修改的莫队算法 思路 在进行修改操作的时候,修改操作是会对答案 ...
- 洛谷 P1903 [国家集训队]数颜色 / 维护队列
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...
- P1903 [国家集训队]数颜色 / 维护队列
关于时间复杂度 对于多维莫队的复杂度差不多为\(O(n^{\frac{2k-1}{k}})\) 摘自zhihu大佬 奇偶分类优化 return a.l == b.l ? (a.l & 1) ? ...
- luoguP1903 [国家集训队]数颜色 / 维护队列
带修改莫队经典题目 关于莫队的一篇很好的blog 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第 ...
- [国家集训队]数颜色 / 维护队列 (带修莫队模板题)
题意: 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. ...
- P1903-[国家集训队]数颜色/维护队列【带修莫队】
正题 题目链接:https://www.luogu.com.cn/problem/P1903 题目大意 要求支持两个操作 QLR:Q\ \ L\ \ R:Q L R:询问L,RL,RL,R之间有多 ...
- [国家集训队]数颜色
[国家集训队]数颜色 题解 很水的一道带修莫队板子题. 我们只需要将操作时间看作是当前询问的第三维,排序后跑莫队即可. 三维莫队块长为n23n^{\frac{2}{3}}n32时时间复杂度是最优的, ...
- Bzoj 2453: 维护队列 Bzoj 2120: 数颜色 分块,bitset
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 578 Solved: 247 [Submit][Status][Discus ...
- 中国最新奥数竞赛成绩出炉:南师大附中女生严彬玮满分夺冠!60人国家集训队名单公布...
雷刚 发自 副中心 量子位 报道 | 公众号 QbitAI 第35届中国数学奥林匹克竞赛成绩公布. 同时也意味着新一届中国奥数国家集训队,正式集结. 60名中学生. 湖北贡献9人.广东7人,上海6人 ...
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题学习笔记】
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec Memory Limit: 259 MB Submit: 9894 Solved: 4561 [Su ...
最新文章
- 一起学spring--spring事件机制--监听器
- 实现迷你解析器把字符串解析成NestInteger类 Mini Parser
- Flutter开发之Scaffold 脚手架的使用(39)
- java和python可以在一个项目中同时使用么-java调用python的几种用法(看这篇就够了)...
- python爬虫多进程_Python爬虫技术--基础篇--多进程
- UITableView (4): 在TableView中移动cell和Section 从TableView中删除cell和section 添加系统默认刷新控件...
- C MySql封装类 高性能连接池_在vc中通过连接池操作mysql(api方式),附c++访问mysql的封装类...
- serialport 延时计时器 修改_为了夜经济,青岛真是拼了!地铁公交延时运营,再也不怕没车了...
- 《Clean Code》 代码简洁之道
- 创新创业技术路线怎么写_2016如何撰写创新创业项目申请书.ppt
- Docker容器网络模式与数据管理
- Mirai僵尸网络介绍以及源码
- TestNG使用教程
- Autocad 2022版本插件开发基础1
- 快速接入 微信微博QQ钉钉 原生登录分享
- 基于STM32F103的步进电机S型曲线加减速算法与实现
- 蓝牙鼠标卡顿,蓝牙与wifi冲突解决方式
- C语言——数组定义及用法
- 二叉树中序遍历的非递归算法
- 如何让笔记获得更多曝光量?小红书曝光机制是怎样的