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] ...
随机推荐
- Net Core学习笔记
Net Core 官网:https://dotnet.github.io/ Net Core Api: https://docs.microsoft.com/en-us/dotnet/api/?vie ...
- Prism MEF example
Related Attributes These attributes are under namespace System.ComponentModel.Composition Import The ...
- OSG-基础知识-程序框架
本文转至http://www.cnblogs.com/shapherd/archive/2010/08/10/osg.html 作者写的比较好,再次收藏,希望更多的人可以看到这个文章 互联网是是一个相 ...
- 第一篇 HTML基础
浏览网页,就是上网,上网的本质就是下载内容. 浏览器是个解释器,用来执行HTML.css.JS代码的. HTML,CSS, JavaScript 号称网络三剑客. 1. 浏览器发送一个域名给服务端 2 ...
- Linux命令应用大词典-第5章 显示文本和文件内容
5.1 cat:显示文本文件 5.2 more:分页显示文本文件 5.3 less:回卷显示文本文件 5.4 head:显示指定文件前若干行 5.5 tail:查看文件末尾数据 5.6 nl:显示文件 ...
- Siki_Unity_1-9_Unity2D游戏开发_Roguelike拾荒者
Unity 1-9 Unity2D游戏开发 Roguelike拾荒者 任务1:游戏介绍 Food:相当于血量:每走一步下降1,吃东西可以回复(果子10药水20),被怪物攻击会减少中间的障碍物可以打破, ...
- 完整的正则表达式知识汇总(Python知识不断更新)
## 大纲: ## 一.正则概述 1.正则是什么 正则就是一套规则,或者语法 2.正则的作用 让我们判断是否符合我们的的规则,或者根据规则找到符合规则的数据 3.使用场景 可以用正则判断我们输入的邮箱 ...
- (python)leetcode刷题笔记05 Longest Palindromic Substring
5. Longest Palindromic Substring Given a string s, find the longest palindromic substring in s. You ...
- POJ - 3259
要判断是否有负的权值 #include<iostream> #include<stdio.h> #include<algorithm> #include<st ...
- 浪在ACM新春大作战
题目链接: # Name 补题状态 A Memory and Crow 已补 B Memory and Trident 已补 C Memory and De-Evolution 已补 D Memory ...