BZOJ2453:维护队列——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2453
Description
Input
Output
Sample Input
1 2
Q 1 2
R 1 2
Q 1 2
Sample Output
1
HINT
对于100%的数据,有1 ≤ N ≤ 10000, 1 ≤ M ≤ 10000,小朋友A不会修改超过1000次,所有颜色均用1到10^6的整数表示。
——————————————————————————————————————
一种单点修改的分块。
我们维护:
1.sum[i][j]:前j块i元素出现次数。
2.ans[i][j]:i~j块的颜色种数。
修改的时候我们显然sum数组可以O(sqrtN)修改成功,而ans数组通过暴力也可以在O(N/4)的复杂度中修改成功。
(实现方法看代码吧……)
剩下的查询就比较简单了(可能是分块分多的错觉)
#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=;
const int SQRTN=;
const int M=;
const int INF=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct question{
char op[];
int l,r;
}q[N];
int n,m,lim,s,cnt,a[N],b[M],bl[SQRTN],br[SQRTN];
int sum[M][SQRTN],ans[SQRTN][SQRTN];
bool vis[M];
inline void initLSH(){
sort(b+,b+lim+);
lim=unique(b+,b+lim+)-b-;
for(int i=;i<=n;i++){
a[i]=lower_bound(b+,b+lim+,a[i])-b;
}
return;
}
inline int LSH(int x){return lower_bound(b+,b+lim+,x)-b;}
inline void intoblock(){
for(int i=;i<=n;i++){
if(i%s==){br[cnt]=i-;bl[++cnt]=i;}
}
br[cnt]=n;bl[cnt+]=n+;
return;
}
inline void init(){
for(int i=;i<=cnt;i++){
for(int j=;j<=lim;j++)sum[j][i]=sum[j][i-];
for(int j=bl[i];j<=br[i];j++){
sum[a[j]][i]++;
}
}
for(int i=;i<=cnt;i++){
for(int j=i;j<=cnt;j++){
ans[i][j]=ans[i][j-];
for(int k=bl[j];k<=br[j];k++)vis[a[k]]=;
for(int k=bl[j];k<=br[j];k++){
int t=a[k];
if(!vis[t]){
int c=sum[t][j-]-sum[t][i-];
if(!c)ans[i][j]++;
vis[t]=;
}
}
}
}
return;
}
inline void modify(int x,int c){
if(a[x]==c)return;
int now=(x-)/s+;
int old=a[x];
a[x]=c;
int nw=a[x];
for(int i=;i<=now;i++){
for(int j=now;j<=cnt;j++){
if(sum[old][j]-sum[old][i-]==)ans[i][j]--;
if(sum[nw][j]-sum[nw][i-]==)ans[i][j]++;
}
}
for(int i=now;i<=cnt;i++)sum[old][i]--,sum[nw][i]++;
return;
}
inline int query(int l,int r){
int cur=;
if(r-l+<=*s){
for(int i=l;i<=r;i++)vis[a[i]]=;
for(int i=l;i<=r;i++){
int t=a[i];
if(!vis[t]){
cur++;
vis[t]=;
}
}
return cur;
}
int L=(l-)/s+,R=(r-)/s+;
cur+=ans[L+][R-];
for(int i=l;i<=br[L];i++)vis[a[i]]=;
for(int i=bl[R];i<=r;i++)vis[a[i]]=;
for(int i=l;i<=br[L];i++){
if(!vis[a[i]]){
int c=sum[a[i]][R-]-sum[a[i]][L];
if(!c)cur++;
vis[a[i]]=;
}
}
for(int i=bl[R];i<=r;i++){
if(!vis[a[i]]){
int c=sum[a[i]][R-]-sum[a[i]][L];
if(!c)cur++;
vis[a[i]]=;
}
}
return cur;
}
int main(){
n=read();m=read();s=sqrt(n);
for(int i=;i<=n;i++)a[i]=b[++lim]=read();
for(int i=;i<=m;i++){
cin>>q[i].op;
q[i].l=read(),q[i].r=read();
if(q[i].op[]=='R')b[++lim]=q[i].r;
}
initLSH();
intoblock();
init();
for(int i=;i<=m;i++){
if(q[i].op[]=='R')modify(q[i].l,LSH(q[i].r));
else printf("%d\n",query(q[i].l,q[i].r));
}
return ;
}
BZOJ2453:维护队列——题解的更多相关文章
- BZOJ2453: 维护队列
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 183 Solved: 89[Submit][Status] Descripti ...
- [bzoj2453]维护队列_带修改莫队
维护队列 bzoj-2453 题目大意:给定一个n个数序列,支持查询区间数的种类数,单点修改.不强制在线. 注释:$1\le n,m\le 10^5$. 想法: 带修改莫队裸题. 如果没有修改操作的话 ...
- [BZOJ2453]维护队列|分块
Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会 ...
- BZOJ2453维护队列&&BZOJ2120数颜色
2016-05-28 11:20:22 共同的思路: 维护某种颜色上一次在哪里出现pre,可以知道当pre<询问的l时更新答案 块内按照pre排序 修改的时候重新O(n)扫一遍,如果和之前的不一 ...
- bzoj2120: 数颜色 &&bzoj2453: 维护队列
题目大意: 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会依据个人喜好 ...
- 【分块】bzoj2453 维护队列
http://www.cnblogs.com/autsky-jadek/p/4020296.html 同bzoj2120. #include<cstdio> #include<cma ...
- [BZOJ2120] 数颜色 && [bzoj2453] 维护队列(莫队 || 分块)
传送门 只有第一个,第二个权限题. 分块,然而wa,没看出来错在哪里,有时间再看. #include <cmath> #include <cstdio> #include &l ...
- 【BZOJ2453】维护队列/【BZOJ2120】数颜色 分块
[BZOJ2453]维护队列 Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色 ...
- 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 653 Solved: 283[Submit][Status][Discuss] ...
随机推荐
- Spring的cache缓存介绍
从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该 ...
- php post
post form function post($remote_server,$data,$second=60){ $ch = curl_init();if(is_string($data)){ $t ...
- C# Builder
如下: class Program { static void Main(string[] args) { ).BuildB(2.1).BuildUp(); Console.Read(); } } p ...
- Selenium基础之--01(将浏览器最大化,设置浏览器固定宽、高,操控浏览器前进、后退)
1,将浏览器最大化 我们知道调用启动的浏览器不是全屏的,这样不会影响脚本的执行,但是有时候会影响我们"观看"脚本的执行. coding=utf-8 from selenium im ...
- laravel 的DB::raw() 语法使用
z之前在项目中遇到一个问题,复杂的sql查询,用laravel的查询构造器,非常的不方便,各种查询条件拼接一长串拼得脑瓜疼:然后想使用原生的sql语句来查询,然后又使用不了laravel的pagina ...
- TW实习日记:第18天
今天的bug没有那么多了,都是些小bug,一下就改好了.或者是接口那边数据返回的有问题,通知一下同事就ok了.主要今天是在赶功能进度,然而有一个功能模块需求里并没有写,实在是不知道要做成什么样子,真的 ...
- HDU 1403 Longest Common Substring(后缀自动机——附讲解 or 后缀数组)
Description Given two strings, you have to tell the length of the Longest Common Substring of them. ...
- PHP 5.6.32 增加pdo_dblib.so拓展
首先说明,php增加pdo_dblib.so拓展不需要重新编译php源文件,只需要增加dblib源包即可. 1.下载安装所需包 1.#下载 wget http://mirrors.ibiblio.or ...
- unity像素贪吃蛇
[ 星 辰 · 别 礼 ] 设计过程: 首先,在之前玩坏控制台做的那个c#贪吃蛇之后,我以为做unity会很简单,但事实比较不如人意...拖了好几天.因为过程中遇到一些问题 蛇身的移动,还是用列表,将 ...
- java — 垃圾回收
1. 垃圾回收的意义 在java中,当没有对象指向原先分配给某个对象的内存的时候,这片内存就变成了垃圾,JVM的一个系统级线程就会自动释放这个内存块,垃圾回收意味着程序不再需要的对象是“无用的信息”, ...