题目描述

墨墨购买了一套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

思路:带修莫队模版题

源代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define PI acos(-1.0)
#define E 1e-9
#define INF 0x3f3f3f3f
#define LL long long
const int MOD=10007;
const int N=1000000+5;
const int dx[]= {-1,1,0,0};
const int dy[]= {0,0,-1,1};
using namespace std;struct Node{int l,r;//询问的左右端点int time;//时间维度int id;//询问的编号
}q[N];
struct Change{int pos;//要修改的位置int col;//要改成的值
}c[N];
int n,m,a[N];
int block;//分块
int numQ,numC;//查询、修改操作的次数
LL ans,cnt[N];
LL res[N];bool cmp(Node a,Node b){//排序return (a.l/block)^(b.l/block) ? a.l<b.l : ((a.r/block)^(b.r/block)?a.r<b.r:a.time<b.time);
}void add(int x){//统计新的,根据具体情况修改if(cnt[x]==0)ans++;cnt[x]++;}
void del(int x){//减去旧的,根据具体情况修改cnt[x]--;if(cnt[x]==0)ans--;
}
void change(int x,int ti){//改变时间轴if(c[ti].pos>=q[x].l&&c[ti].pos<=q[x].r){del(a[c[ti].pos]);//删除指定位置上的值add(c[ti].col);//统计新的数}swap(c[ti].col,a[c[ti].pos]);//直接互换,下次执行时必定是回退这次操作
}
int main(){while(scanf("%d%d",&n,&m)!=EOF){ans=0;numQ=0;numC=0;memset(cnt,0,sizeof(cnt));block=pow(n,0.66666);//分块for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=m;i++){char op[10];scanf("%s",op);if(op[0]=='Q'){//查询操作++numQ;//查询操作次数+1scanf("%d%d",&q[numQ].l,&q[numQ].r);q[numQ].id=numQ;//序号q[numQ].time=numC;//时间轴}else{//修改操作++numC;//修改操作次数+1scanf("%d%d",&c[numC].pos,&c[numC].col);}}sort(q+1,q+numQ+1,cmp);//对询问进行排序int l=1,r=0,time=0;//左右指针与时间轴for(int i=1;i<=numQ;i++){int ql=q[i].l,qr=q[i].r;//询问的左右端点int qtime=q[i].time;//询问的时间轴while(l>ql) add(a[--l]);//[l-1,r,time]while(l<ql) del(a[l++]);//[l+1,r,time]while(r<qr) add(a[++r]);//[l,r+1,time]while(r>qr) del(a[r--]);//[l,r-1,time]while(time<qtime) change(i,++time);//[l,r,time+1]while(time>qtime) change(i,time--);//[l,r,time-1]res[q[i].id]=ans;//获取答案}for(int i=1;i<=numQ;i++)printf("%lld\n",res[i]);}return 0;
}

数颜色(洛谷-P1903)相关推荐

  1. 信息学奥赛一本通 1970:【15NOIP普及组】扫雷游戏 | OpenJudge NOI 1.8 14:扫雷游戏地雷数计算 | 洛谷 P2670 [NOIP2015 普及组] 扫雷游戏

    [题目链接] ybt 1970:[15NOIP普及组]扫雷游戏 OpenJudge NOI 1.8 14:扫雷游戏地雷数计算 洛谷 P2670 [NOIP2015 普及组] 扫雷游戏 [题目考点] 1 ...

  2. 信息学奥赛一本通 1309:【例1.6】回文数(Noip1999) | 洛谷 P1015 [NOIP1999 普及组] 回文数

    [题目链接] ybt 1309:[例1.6]回文数(Noip1999) 洛谷 P1015 [NOIP1999 普及组] 回文数 注:两OJ上的问题考察内容相同,但输出要求不同 [题目考点] 1.高精度 ...

  3. N进制正反累加判回文数(洛谷P1015题题解,Java语言描述)

    题目要求 P1015题目链接 分析 开始的时候写了这么一个代码,应该是比较基础的,是十进制的. private static void low() {Scanner scanner = new Sca ...

  4. 二分查找——A-B数对(洛谷 P1102)

    题目选自洛谷P1102 分析题目,如果决定枚举A,那么问题就变成了统计数列中B+C出现了多少次. 把数列排列,那么B+C 会对应这个数列的连续一段.只要能快速找到这个连续段的左端点和右端点,也就是B+ ...

  5. 麦森数(洛谷P1045题题解,Java语言描述)

    题目要求 题目链接 分析 这题挺经典的,快速幂取模算法,如果求出大数再取模就可能T掉. 之前有篇文章写了这个算法:<快速幂算法详解&&快速幂取模算法详解> 既然是Java, ...

  6. 用0和5凑被90整除的max数(洛谷P2192题题解,Java语言描述)

    题目要求 P2192题目链接 分析 盘一盘各种情况吧: 要被90整除,就必须被10整除,所以必须有0,没0就是-1啊. 要被90整除,一堆5,靠0是没用的,只能是9个5凑一堆儿才有用,有0但凑不够9个 ...

  7. 广度优先搜索——填涂颜色(洛谷 P1162)

    题目选自洛谷P1162 首先讲一下思路:根据题意,当找到第一个1时,其右下必然是圈内的0,那么只要从这个0开始广搜寻找联通块就可以了.(因为圈只有一个,那么当找到第一个1之后便要打断循环,很重要!) ...

  8. 【洛谷P1903】数颜色

    题目大意:给定一个长度为 N 的序列,每个点有一个颜色.现给出 M 个操作,支持单点修改颜色和询问区间颜色数两个操作. 题解:学会了序列带修改的莫队. 莫队本身是不支持修改的.带修该莫队的本质也是对询 ...

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

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

最新文章

  1. 需要反射时使用dynamic
  2. AI一分钟 | 特斯拉再融46亿;腾讯AI Lab宣布开源多标签图像数据集
  3. 怎样的架构设计能力,才能成功拿下阿里P7?
  4. AI端计算产业应用:如何快速训练高精度模型并在设备端加速计算 | 公开课报名...
  5. JS:1.3,函数(function)
  6. 风机桨叶故障诊断(六) 利用自编码器进行特征学习
  7. 异常的产生与传递 java
  8. ASN.1编解码:asn1c、enber和unber
  9. 安装完centos6没有eth0,只有回环地址
  10. [JS进阶] JS 之Blob 对象类型
  11. 【算法】排序_基数排序
  12. 用JMS578转接板开卡PS3111主控pSLC模式,带固件下载
  13. 南邮 | 离散数学实验一:利用真值表法求取主析取范式以及主合取范式的实现
  14. WEB认证苹果手机锁屏后出现断开WI-Fi的现象和解决
  15. PCIe5.0的Add-in-Card(AIC)金手指layout建议(一)
  16. 文件编码与文件的读写与0x0D0A
  17. 3Com 905系列介绍
  18. BYOD -- 企业的困境与力量
  19. LV.5 进程、线程和进程间通信
  20. 大话计算机知识流程图,大话数据结构 -- 整理归纳(1)

热门文章

  1. 手把手教你用Matplotlib进行数据可视化
  2. 创建字节跳动之前,张一鸣读过哪些硬核技术书?
  3. 和 Python 2.x 说再见!
  4. 魅族15无法连接计算机,还在为数据丢失而烦恼?魅族15告诉你什么叫做碎屏无忧...
  5. win7怎么清理java缓存文件夹_win7系统清理电脑缓存文件的方法
  6. 越老越值钱,除了程序员?
  7. “零代码”时代已来!程序员真的要去送外卖了?
  8. 突发!Nginx 之父被拘留,原因竟然是“接私活儿”?
  9. 原创 | 一文了解那些和Spring Bean有关的那些注解!
  10. 云原生架构沙龙(成都站)圆满结束(附胶片下载)