BZOJ 2120 数颜色(带修改莫队)
【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=2120
【题目大意】
给出一颜色序列,每次可以修改一个位置的颜色或者询问一个区间不同颜色的数目。
【题解】
我们按照最近一次修改对查询操作进行时间标号,在莫队排序的时候引入时间作为第三维,
对于每个修改操作,我们记录修改之前的颜色和修改之后的颜色,
对于两个相邻两个查询,我们将其之间时间差距的修改操作进行记录或者撤销之后查询即可。
【代码】
#include <cstdio>
#include <algorithm>
#include <cmath>
const int N=1000010;
using namespace std;
int Ans,ans[N],pos[N],c[N],pre[N],sz,cnt,n,m,limit;
struct Q{
int l,r,id,t;
friend bool operator < (const Q &a,const Q &b){
if(pos[a.l]!=pos[b.l])return pos[a.l]<pos[b.l];
if(a.r!=b.r)return a.r<b.r;
return a.t<b.t;
}
}ask[N];
struct update{int pos,c,pre;}w[N];
int in[N],num[N];
void cal(int x){
if(in[x]){if(!--num[c[x]])Ans--;}
else{if(++num[c[x]]==1)Ans++;}
in[x]^=1;
}
void update(int x,int y){
if(in[x]){cal(x);c[x]=y;cal(x);}
else c[x]=y;
}
int main(){
while(~scanf("%d%d",&n,&m)){
int limit=sqrt(n);
for(int i=1;i<=n;i++)scanf("%d",&c[i]),pre[i]=c[i],pos[i]=(i-1)/limit+1,in[i]=0;
cnt=sz=Ans=0;
for(int i=1;i<=m;i++){
char op[10]; scanf("%s",op);
int x,y; scanf("%d%d",&x,&y);
if(op[0]=='R'){w[++cnt].pos=x;w[cnt].c=y;w[cnt].pre=pre[x];pre[x]=y;}
else{ask[++sz].l=x;ask[sz].r=y;ask[sz].id=sz;ask[sz].t=cnt;}
}sort(ask+1,ask+sz+1);
int l,r; cal(l=r=1);
for(int i=1;i<=sz;i++){
for(int j=ask[i-1].t+1;j<=ask[i].t;j++)update(w[j].pos,w[j].c);
for(int j=ask[i-1].t;j>ask[i].t;j--)update(w[j].pos,w[j].pre);
while(l<ask[i].l)cal(l++);
while(l>ask[i].l)cal(--l);
while(r<ask[i].r)cal(++r);
while(r>ask[i].r)cal(r--);
ans[ask[i].id]=Ans;
}for(int i=1;i<=sz;i++)printf("%d\n",ans[i]);
}return 0;
}
BZOJ 2120 数颜色(带修改莫队)的更多相关文章
- bzoj 2120 数颜色 带修改莫队
带修改莫队,每次查询前调整修改 #include<cstdio> #include<iostream> #include<cstring> #include< ...
- BZOJ 2120 数颜色 (带修莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6367 Solved: 2537[Submit][Status][Discuss] ...
- bzoj 2120 数颜色 (带修莫队)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间 l - r 内颜色的种类 ,R 单点修改 思路 ...
- BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]
BZOJ传送门:洛谷传送门 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R ...
- BZOJ2120数颜色(带修改莫队)
莫队算法是一种数据结构的根号复杂度替代品,主要应用在询问[l,r]到询问[l+1,r]和[l,r+1]这两个插入和删除操作复杂度都较低的情况下.具体思想是:如果把一个询问[l,r]看做平面上的点(l, ...
- BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...
- Luogu P1903 BZOJ 2120 数颜色 带修改的莫队
https://www.luogu.org/problemnew/show/P1903 之前切过这道题,复习莫队再切一遍,不过我之前写的是主席树和树状数组,也不知道我当时怎么想的…… 这个题卡常我没写 ...
- P1903 [国家集训队]数颜色 (带修改莫队)
题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...
- P1903 [国家集训队]数颜色 带修改莫队板子
大概就是要多加一维time 然后按照(l的块,r的块,time)为关键字排序 转移区间修改还是按照莫队的方式(每个修改要记修改前后的状态) 然后玄学dalao告诉窝块大小设为\(O(n^{\frac{ ...
- [国家集训队][bzoj2120] 数颜色 [带修改莫队]
题面: 传送门 思路: 这道题和SDOI2009的HH的项链很像,只是多了一个修改 模板套上去呀 莫队学习请戳这里:莫队 Code: #include<iostream> #include ...
随机推荐
- 透彻理解Spring事务设计思想之手写实现(山东数漫江湖)
前言 事务,是描述一组操作的抽象,比如对数据库的一组操作,要么全部成功,要么全部失败.事务具有4个特性:Atomicity(原子性),Consistency(一致性),Isolation(隔离性),D ...
- [NOIP2011]刷水
前几天做了NOIP2011的题,感觉不是那么难. 这边先做了两天的前两题,T3还没打. D1T1:顺次读入,分别判断是否覆盖即可,照例大水: #include<cstdio> ],b[], ...
- perl登录ssh
use warnings; use strict; use Net::SSH::Perl; my $host = '192.168.255.128'; my $username = 'root'; m ...
- FineReport——JS监听其他控件事件
首先在参数面板和报表中分布添加一个button,用于被监听: 参数面板 控件名:temp: temp点击事件:alert("temp"); 报表 控件名:exprt: temp点击 ...
- MySQL的读写分离---主从复制、主主复制
1.复制是基于BinLog日志 存在三种日志格式:Statement:存储Sql语句,存储日志量是最小的.有可能复制不一致Row:存储event数据,存储日志量大,但是不能很直接进行读取:Mixed: ...
- lnmp的安装--php
1.下载php源码 wget http://cn2.php.net/distributions/php-5.6.3.tar.gz tar zxvf php-5.6.3.tar.gz cd php-5. ...
- python_day4学习笔记
一.内置函数
- OpenCL与CUDA,CPU与GPU
OpenCL OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式.免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计 ...
- vue之v-text渲染多值
其原理,是利用vue里的computed计算属性来做. 请看代码: <div id='app'> <div v-text="newUsers"></d ...
- OpenStack 存储服务 Cinder存储节点部署LVM (十四)
部署在block(10.0.0.103)主机 一)配置lvm 1.安装lvm2软件包 yum install lvm2 -y 2.启动LVM的metadata服务并且设置该服务随系统启动 system ...