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

1、 \(Q\) \(L\) \(R\)

代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。

2、 \(R\) \(P\) \(Col\)

把第P支画笔替换为颜色\(Col\)。

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

这道题目跟小Z的袜子非常相像,只是多了一个操作——修改。

我们仍然继续小Z的袜子的想法,如果当前询问的区间之前有修改,那么我们就暴力修改,如果没有,我们就不修改。

这样仍然会出现问题:

有可能在当前询问时,一些由于排序所以先被修改的量此时仍然被修改,但是当前询问时该元素并没有被修改

所以,我们考虑维护一个时间轴,原理跟区间的\([l,r]\)扩张差不多。

设上一个询问时间为\(tim\)

如果当前询问比\(tim\)时间早,那么时光倒流,撤销相应修改

如果当前询问比\(tim\)时间晚,那么时光快进,完成相应修改

于是,这道题目就这样愉快的解决了

最后,送给大家一首打油诗


假如 你被卡了常

不要灰心

忧郁的日子里要心平气和

相信吧

改一改块的长度

就可以快10倍


贴代码


#include<bits/stdc++.h>
using namespace std;
const int maxn=5e4+10;
const int col=1e6+10;
int n,m,len;
int a[maxn];
int cnt1,b[maxn];
struct query{
int l,r,id,tim;
friend bool operator <(query x,query y)
{
if(b[x.l]!=b[y.l])
return x.l<y.l;
if(b[x.r]!=b[y.r])
{
if(b[x.l]&1) return x.r<y.r;
else return x.r>y.r;
}
}
}q[maxn];
struct update{
int x,y;
}upd[maxn];
int cnt2;
int ans[maxn];
int cnt[col];
int now;
void add(int x){now+=!cnt[x]++;}
void del(int x){now-=!--cnt[x];}
int l=0,r=0,tag=0;
void change(int x)
{
if(l<=upd[x].x&&upd[x].x<=r)
{
del(a[upd[x].x]);
add(upd[x].y);
}
swap(upd[x].y,a[upd[x].x]);
}
int main()
{
scanf("%d%d",&n,&m);
len=sqrt(n)*15;
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
char opt[5];
int x,y;
for(int i=1;i<=m;++i)
{
scanf("%s%d%d",opt,&x,&y);
if(opt[0]=='Q')
++cnt1,q[cnt1]={x,y,cnt1,cnt2};
else
++cnt2,upd[cnt2]={x,y};
b[i]=(i-1)/len+1;
}
stable_sort(q+1,q+cnt1+1);
for(int i=1;i<=cnt1;++i)
{
while(l<q[i].l) del(a[l++]);
while(l>q[i].l) add(a[--l]);
while(r>q[i].r) del(a[r--]);
while(r<q[i].r) add(a[++r]);
while(tag<q[i].tim) change(++tag);
while(tag>q[i].tim) change(tag--);
ans[q[i].id]=now;
}
for(int i=1;i<=cnt1;++i)
printf("%d\n",ans[i]);
return 0;
}

洛谷 P1903 [国家集训队]数颜色 / 维护队列的更多相关文章

  1. 洛谷P1903 [国家集训队]数颜色 / 维护队列 ( 带 修 )

    题意:有两种操作: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col. 对每个1操作 输出答案: 带修莫队 模板题 (加 ...

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

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

  3. bzoj2120 / P1903 [国家集训队]数颜色 / 维护队列(带修改莫队)

    P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队 在原有指针$(l,r)$上又添加了时间指针$t$ 贴一段dalao的解释 带修改的莫队,和原版莫队相比,多了一个时间轴 原版莫队是将区间( ...

  4. 洛谷 P1903 [国家集训队]数颜色 解题报告

    P1903 [国家集训队]数颜色 题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1.Q L R代表询问你从第\(L\) ...

  5. BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]

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

  6. P1903 [国家集训队]数颜色 / 维护队列(莫队区间询问+单点修改)

    题目链接:https://www.luogu.org/problemnew/show/P1903 题目大意:中文题目 具体思路:莫队单点修改+区间询问模板题,在原来的区间询问的基础上,我们要记录当前这 ...

  7. ●洛谷P1903 [国家集训队]数颜色

    题链: https://www.luogu.org/problemnew/show/P1903题解: 序列带修莫队, 推荐博客https://www.cnblogs.com/Paul-Guderian ...

  8. [洛谷P1903][国家集训队]数颜色

    题目大意:有$n$支画笔,有两个操作 $Q\;l\;r:$询问$[l,r]$中有几种颜色 $R\;p\;Col:$把第$p$支画笔的颜色改成$Col$ 题解:带修莫队,分为$n^{\frac{1}{3 ...

  9. 洛谷 P1903 [国家集训队]数颜色

    题意简述 给定一个数列,支持两个操作 1.询问l~r有多少不同数字 2.修改某个数字 题解思路 带修莫队 如果修改多了,撤销修改 如果修改少了,进行修改 代码 #include <cmath&g ...

随机推荐

  1. 关于视频断点续播和H5的本地存储

    前段时间,需要在下实现一个视频的断点续播功能,呃,我不会呀,这就很尴尬了.然后呢,在下就想起了一个叫做localStorage的东西.这是个什么东西呢?在网上查阅了一些资料后,在下发现这是webSto ...

  2. (五) Keras Adam优化器以及CNN应用于手写识别

    视频学习来源 https://www.bilibili.com/video/av40787141?from=search&seid=17003307842787199553 笔记 Adam,常 ...

  3. Centos7 使用 kubeadm 安装Kubernetes 1.13.3

    目录 目录 什么是Kubeadm? 什么是容器存储接口(CSI)? 什么是CoreDNS? 1.环境准备 1.1.网络配置 1.2.更改 hostname 1.3.配置 SSH 免密码登录登录 1.4 ...

  4. Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块

    Python第十五天  datetime模块 time模块   thread模块  threading模块  Queue队列模块  multiprocessing模块  paramiko模块  fab ...

  5. 自学MongoDB(1)

    MongoDB是nosql(非关系型数据库)中的一种,面向文档的数据库,介于传统的结构化数据库(关系型数据库)与非关系型数据库(文件储存)之间的一种,具有数据结构非常松散和非常灵活的特点;常用于存储分 ...

  6. js 倒计时跳转

    用js实现简单的倒计时结束页面跳转效果,主要用到setInterval()和clearInterval()方法,页面跳转使用window.location.href = " ".倒 ...

  7. Python函数默认参数的陷阱

    默认参数实际上只有一个值 代码1 def func(l = 1): l += 1 print(l) func() func() func() 代码2 lst = [] def func(a,l = l ...

  8. 《JavaScript设计模式与开发实践》笔记第八章 发布-订阅模式

    第八章 发布-订阅模式 发布-订阅模式描述 发布-订阅模式又叫观察者模式,它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. 发布-订阅模式可以广泛应用于 ...

  9. mysql查询order by 指定字段排序

    当MySQL查询时排序的字段不是数字时而是汉字的时候也可以用when  then 来指定排序. 列如yewu_check表的status 字段不是0,1,2而是汉字待办,已办,退回.可以如下写法: S ...

  10. 软件定义网络(Software Defined Network,SDN)简介

    SDN的三大关键要素 第一关键要素是转发与控制分离,这使得网络交换机的数据转发变得更加简单.快速:同时,控制变成了网络操作系统中一个相对集中的逻辑功能. 第二个关键要素是OpenFlow协议,它向交换 ...