洛谷 P1903 [国家集训队]数颜色 / 维护队列
墨墨购买了一套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 [国家集训队]数颜色 / 维护队列的更多相关文章
- 洛谷P1903 [国家集训队]数颜色 / 维护队列 ( 带 修 )
题意:有两种操作: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2. R P Col 把第P支画笔替换为颜色Col. 对每个1操作 输出答案: 带修莫队 模板题 (加 ...
- 洛谷 P1903 [国家集训队]数颜色 / 维护队列 带修莫队
题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: \(1\). \(Q\) \(L\) \(R\)代表询问你从第\(L\) ...
- bzoj2120 / P1903 [国家集训队]数颜色 / 维护队列(带修改莫队)
P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队 在原有指针$(l,r)$上又添加了时间指针$t$ 贴一段dalao的解释 带修改的莫队,和原版莫队相比,多了一个时间轴 原版莫队是将区间( ...
- 洛谷 P1903 [国家集训队]数颜色 解题报告
P1903 [国家集训队]数颜色 题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1.Q L R代表询问你从第\(L\) ...
- BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]
BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...
- P1903 [国家集训队]数颜色 / 维护队列(莫队区间询问+单点修改)
题目链接:https://www.luogu.org/problemnew/show/P1903 题目大意:中文题目 具体思路:莫队单点修改+区间询问模板题,在原来的区间询问的基础上,我们要记录当前这 ...
- ●洛谷P1903 [国家集训队]数颜色
题链: https://www.luogu.org/problemnew/show/P1903题解: 序列带修莫队, 推荐博客https://www.cnblogs.com/Paul-Guderian ...
- [洛谷P1903][国家集训队]数颜色
题目大意:有$n$支画笔,有两个操作 $Q\;l\;r:$询问$[l,r]$中有几种颜色 $R\;p\;Col:$把第$p$支画笔的颜色改成$Col$ 题解:带修莫队,分为$n^{\frac{1}{3 ...
- 洛谷 P1903 [国家集训队]数颜色
题意简述 给定一个数列,支持两个操作 1.询问l~r有多少不同数字 2.修改某个数字 题解思路 带修莫队 如果修改多了,撤销修改 如果修改少了,进行修改 代码 #include <cmath&g ...
随机推荐
- WebAPI Angularjs 上传文件
直接上代码 HTML页面代码: <label>资源URL</label> <input type="text" class="form-co ...
- 在 DotNetCore 3.0 程序中使用通用协议方式启动文件关联应用
问题描述 在传统的基于 .NET Framework 的 WPF 程序中,我们可以使用如下代码段启动相关的默认应用: # 启动默认文本编辑器打开 helloworld.txt Process.Star ...
- 鼠标事件以及clientX、offsetX、screenX、pageX、x的区别
鼠标事件 鼠标事件有下面这几种: 1. onclick 鼠标点击事件 box.onclick = function(e){ console.log(e) } 2. onmousedown 鼠标按下事件 ...
- jsp内置对象-response对象
一.概念 隐含对象response是javax.servlet.HttpServletResponse接口实现类的对象.response对象封装了JSP产生的响应,用于响应客户端的请求,向客户端输出信 ...
- .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
Pop分组模式和表格模式对比 关键词: 驰骋工作流引擎 表单引擎 ccflow .net开源工作流 jflow Java工作流引擎 驰骋工作流程快速开发平台 工作流程管理系统 工作流引擎 a ...
- RecycleView的notifyItemRemoved使用注意
转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10116095.html 我们为了移除RecycleView的某一项,会用RecycleView的noti ...
- 【Linux】【MySQL】CentOS7安装最新版MySQL8.0.13(最新版MySQL从安装到运行)
1.前言 框框博客在线报时:2018-11-07 19:31:06 当前MySQL最新版本:8.0.13 (听说比5.7快2倍) 官方之前表示:MySQL 8.0 正式版 8.0.11 已发布,MyS ...
- 结对编程总结 -- 赵雄君 & 冯小纯
结对编程总结 一. 项目综述 通过对比分析两人代码,决定以本人的个人项目代码作为主要参考. 本系统是基于QT Creator 4.5.2开发环境,开发语言C++,能够实现用户注册,发送短 ...
- C# 实体转为json字符串
C# 实体转为json字符串 Catalog cata = new Catalog(); cata.C_platformid = 0; cata.C_isnav = 0; cata.C_isvalid ...
- Redis的中并发问题的解决方案小结
什么是Redis的并发竞争问题 Redis的并发竞争问题,主要是发生在并发写竞争.考虑到redis没有像db中的sql语句,update val = val + 10 where ...,无法使用这种 ...