luogu 1903 [国家集训队]数颜色 / 维护队列 带修改莫队
十分玄学的数据结构~
code:
#include <bits/stdc++.h>
#define N 1000006
#define setIO(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
using namespace std;
int n,m,ans,B,cnt,tot,now;
int a[N],tim[N],output[N];
struct query
{
int l,r,t,id;
bool operator<(query b) const
{
return l/B==b.l/B?(r/B==b.r/B?t<b.t:r<b.r):l<b.l;
}
}q[N];
struct change
{
int p,col;
}c[N];
void add(int x)
{
if(tim[x]==0) ++ans;
++tim[x];
}
void del(int x)
{
if(tim[x]==1) --ans;
--tim[x];
}
void work(int x,int d)
{
// 需要进行变动
if(c[d].p>=q[x].l&&c[d].p<=q[x].r) del(a[c[d].p]), add(c[d].col);
swap(c[d].col, a[c[d].p]);
}
int main()
{
// setIO("input");
int i,j,l=2,r=1;
scanf("%d%d",&n,&m);
B=pow(n,0.6666);
for(i=1;i<=n;++i) scanf("%d",&a[i]);
for(i=1;i<=m;++i)
{
char op[2];
scanf("%s",op);
if(op[0]=='Q')
{
++cnt;
scanf("%d%d",&q[cnt].l,&q[cnt].r);
q[cnt].id=cnt;
q[cnt].t=tot;
}
else
{
++tot;
scanf("%d%d",&c[tot].p,&c[tot].col);
}
}
sort(q+1,q+1+cnt);
for(i=1;i<=cnt;++i)
{
for(;l>q[i].l;) add(a[--l]);
for(;r<q[i].r;) add(a[++r]);
for(;l<q[i].l;) del(a[l++]);
for(;r>q[i].r;) del(a[r--]);
for(;now<q[i].t;) work(i, ++now);
for(;now>q[i].t;) work(i, now--);
output[q[i].id]=ans;
}
for(i=1;i<=cnt;++i) printf("%d\n",output[i]);
return 0;
}
luogu 1903 [国家集训队]数颜色 / 维护队列 带修改莫队的更多相关文章
- P1903 [国家集训队]数颜色 / 维护队列 带修改莫队
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...
- Luogu P1903 [国家集训队]数颜色 / 维护队列 (带修莫队)
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...
- 洛谷 P1903 [国家集训队]数颜色 / 维护队列 带修莫队
题目描述 墨墨购买了一套\(N\)支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: \(1\). \(Q\) \(L\) \(R\)代表询问你从第\(L\) ...
- P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队
\(\color{#0066ff}{ 题目描述 }\) 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支 ...
- LUOGU P1903 [国家集训队]数颜色 / 维护队列
传送门 解题思路 带修莫队,第一次写,其实和普通莫队差不多,就是多了个时间轴,块分n^(2/3)最优,时间复杂度O(n^(5/3)). #include<iostream> #includ ...
- bzoj2120 / P1903 [国家集训队]数颜色 / 维护队列(带修改莫队)
P1903 [国家集训队]数颜色 / 维护队列 带修改的莫队 在原有指针$(l,r)$上又添加了时间指针$t$ 贴一段dalao的解释 带修改的莫队,和原版莫队相比,多了一个时间轴 原版莫队是将区间( ...
- 题解 洛谷P1903/BZOJ2120【[国家集训队]数颜色 / 维护队列】
对于不会树套树.主席树的本蒟蒻,还是老老实实的用莫队做吧.... 其实这题跟普通莫队差不了多远,无非就是有了一个时间,当我们按正常流程排完序后,按照基本的莫队来,做莫队时每次循环对于这一次操作,我们在 ...
- P1903 [国家集训队]数颜色 / 维护队列
思路 带修莫队的板子 带修莫队只需要多维护一个时间的指针即可,记录一下每个询问在第几次修改之后,再回退或者前进几个修改操作 排序的时候如果a.l和b.l在一个块里,就看r,如果a.r和b.r在一个块里 ...
- P1903 [国家集训队]数颜色 / 维护队列(带修莫队)
题目描述: 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. ...
随机推荐
- nodejs 入门学习
Node.js学习笔记——Node.js开发Web后台服务 目录 一.简介 二.搭建Node.js开发环境 2.1.安装Node.js 2.2.安装IDE开发Node.js插件 三.第一个Node ...
- kafka之基本介绍
什么是kafka? Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理 ...
- 转------深入理解--Java按值传递和按引用传递
引言 最近刷牛客网上的题目时碰到不少有关Java按值传递和按引用传递的问题,这种题目就是坑呀,在做错了n次之后,查找了多方资料进行总结既可以让自己在总结中得到提高,又可以让其他人少走弯路.何乐而不为? ...
- springboot启动流程(四)application配置文件加载过程
所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 触发监听器加载配置文件 在上一篇文章中,我们看到了Environment对象的创建方法.同时也 ...
- 记一次Git提交报错的问题
通常代码版本控制的步骤是: 在代码版本控制平台新建一个仓库 clone远程仓库到本地 开始编码,然后是一系列add,commit,push 我的步骤是: 在远程代码版本管理平台新建一个仓库 在本地新建 ...
- SVN配置使用及移植
使用svn作为配置管理工具及其普遍的用于项目开发中,网上有很多关于svn的原理介绍及命令行管理教程.这里仅仅分享下个人配置及使用的过程,不通过命令行,可简单的上手操作.如有遗漏欢迎留言交流. 配置及使 ...
- string+DP leetcode-4.最长回文子串
5. Longest Palindromic Substring 题面 Given a string s, find the longest palindromic substring in s. Y ...
- 如何将Chrome本地安装的扩展应用导出到本地
有时由于种种原因,我们不能直接使用Chrome web store进行Chrome扩展应用的安装,这时可以让一位已经安装了某Chrome扩展应用的朋友将他的应用导出到本地成为.crx文件,然后发给你, ...
- Vue获取数据渲染完成事件
主要代码是这两坨 this.nextTick(function(){ alert('数据已经更新') }); this.$nextTick(function(){ alert('v-for渲染已经完成 ...
- 怎么读取properties文件和ini文件?
一.读取properties文件: properties中的内容: server.ip = 127.0.0.1 server.port = 22 //原生java即可读取public static v ...