墨墨购买了一套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. 从QA到工程能效团队

    Engineering Productivity Productivity is our job; testing and quality are the job of everyone involv ...

  2. Mysql 的 create as 和create like 区别

    大家可能使用Navicat Premium时发现很方便,比如复制表或数据结构等,其实这种复制表数据或结构方法就是create table as 和create table like 这种方式实现细心的 ...

  3. MySql 创建新用户

    grant all privileges on scdb.* to szl@localhost identified by '******'; 说明:1.all privileges 所有可用权限,也 ...

  4. 享元模式 FlyWeight 结构型 设计模式(十五)

    享元模式(FlyWeight)  “享”取“共享”之意,“元”取“单元”之意. 意图 运用共享技术,有效的支持大量细粒度的对象. 意图解析 面向对象的程序设计中,一切皆是对象,这也就意味着系统的运行将 ...

  5. es6 generator函数

    es6 新增了Generator函数,一种异步编程的解决方案 回顾一下,es6 提供了新的遍历方法,for of ,适用于各种数据集合,统一了遍历操作,原生支持for of 集合的数据集合有.数组,字 ...

  6. MySQL-每日定点运行

    最近做项目的时候设计每天定点执行的脚本,所以在这 马克一下,方便查找 set time_zone = '+8:00';      set GLOBAL event_scheduler = 1;     ...

  7. MPP-编码示例

    了解MPP的基本功能后,接下来具体分析编码的代码.首先把编码的代码提取出来,方便以后的使用. 完整的编码代码如下,相比较给出的示例代码,做了一些改动,输入的指令全部去除,将函数入口改为利用OpenCV ...

  8. POJ 3085 - Quick Change

    Quick Change Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6288   Accepted: 4468 Desc ...

  9. 探索SQL Server元数据(一)

    简介 在数据库中,我们除了存储数据外,还存储了大量的元数据.它们主要的作用就是描述数据库怎么建立.配置.以及各种对象的属性等.本篇简单介绍如何使用和查询元数据,如何更有效的管理SQLServer 数据 ...

  10. ubuntu18.04修改网卡名称为eth0

    1.修改grub文件 vim /etc/default/grub 查找 GRUB_CMDLINE_LINUX="" 修改为 GRUB_CMDLINE_LINUX="net ...