bzoj 2120
2120: 数颜色
Time Limit: 6 Sec Memory Limit: 259 MB
Submit: 6430 Solved: 2562
[Submit][Status][Discuss]
Description
墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令: 1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。 2、 R P Col 把第P支画笔替换为颜色Col。为了满足墨墨的要求,你知道你需要干什么了吗?
Input
第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数。第2行N个整数,分别代表初始画笔排中第i支画笔的颜色。第3行到第2+M行,每行分别代表墨墨会做的一件事情,格式见题干部分。
Output
对于每一个Query的询问,你需要在对应的行中给出一个数字,代表第L支画笔到第R支画笔中共有几种不同颜色的画笔。
Sample Input
1 2 3 4 5 5
Q 1 4
Q 2 6
R 1 2
Q 1 4
Q 2 6
Sample Output
4
3
4
HINT
对于100%的数据,N≤10000,M≤10000,修改操作不多于1000次,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。
2016.3.2新加数据两组by Nano_Ape
//注意到颜色范围只有1e6,修改操作不超过1000。分块,用pre[i]记录col[i]上一次出现的位置,每一块中的pre数组
//从小到大排序,然后二分找到有几个的pre在询问区间的左端点的左边就是有几种数,两边的区间暴力找。修改时暴力
//修改,更新pre,nex。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=;
int n,m,B,cnt,block[MAXN],pre[MAXN],nex[MAXN],last[],p[MAXN],col[MAXN];
void resort(int x)
{
int l=(x-)*B+,r=min(n,x*B);
for(int i=l;i<=r;i++) p[i]=pre[i];
sort(p+l,p+r+);
}
void build()
{
for(int i=;i<=n;i++){
scanf("%d",&col[i]);
pre[i]=last[col[i]];
if(last[col[i]]) nex[last[col[i]]]=i;
last[col[i]]=i;
block[i]=(i-)/B+;
}
for(int i=;i<=cnt;i++) resort(i);
}
int find(int x,int ql)
{
int l=(x-)*B+,r=x*B,ans=;
int st=l;
while(l<=r){
int mid=(l+r)>>;
if(p[mid]<ql) { ans=mid-st+;l=mid+; }
else r=mid-;
}
return ans;
}
int query(int ql,int qr)
{
int s=;
for(int i=ql;i<=min(n,block[ql]*B);i++)
if(pre[i]<ql) s++;
if(block[ql]!=block[qr]){
for(int i=(block[qr]-)*B+;i<=qr;i++)
if(pre[i]<ql) s++;
}
for(int i=block[ql]+;i<block[qr];i++) s+=find(i,ql);
return s;
}
void update(int x,int y)
{
col[x]=y;
if(nex[x]) { pre[nex[x]]=pre[x];resort(block[nex[x]]); }
if(pre[x]) nex[pre[x]]=nex[x];
int pr=,ne=;
for(int i=x-;i>=;i--)
if(col[i]==y) { pr=i;break; }
for(int i=x+;i<=n;i++)
if(col[i]==y) { ne=i;break; }
pre[x]=pr;nex[x]=ne;
resort(block[x]);
if(pr) nex[pr]=x;
if(ne) { pre[ne]=x;resort(block[ne]); }
}
int main()
{
//freopen("in.txt","r",stdin);
memset(last,,sizeof(last));
scanf("%d%d",&n,&m);
B=sqrt(n);
cnt=n/B+(n%B!=);
build();
while(m--){
char ch[];
int x,y;
scanf("%s%d%d",ch,&x,&y);
if(ch[]=='Q') printf("%d\n",query(x,y));
else update(x,y);
}
return ;
}
bzoj 2120的更多相关文章
- BZOJ 2120 数颜色(带修改的莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MB Submit: 3478 Solved: 1342 [Submit][Status][Discus ...
- BZOJ 2120: 数颜色
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 3623 Solved: 1396[Submit][Status][Discuss] ...
- BZOJ 2120: 数颜色 分块
2120: 数颜色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...
- 【BZOJ 2453|bzoj 2120】 2453: 维护队列 (分块+二分)
2453: 维护队列 Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有 ...
- Bzoj 2120: 数颜色 && 2453: 维护队列 莫队,分块,bitset
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 2645 Solved: 1039[Submit][Status][Discuss] ...
- bzoj 2120 带修改莫队
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 7340 Solved: 2982[Submit][Status][Discuss] ...
- bzoj 2120 数颜色 (带修莫队)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间 l - r 内颜色的种类 ,R 单点修改 思路 ...
- 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 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...
随机推荐
- Alpha阶段项目展示博客
烫烫烫烫烫(hotcode5)团队 1. 团队成员的简介和个人博客地址 刘畅 博客园ID:森高Slontia 身份:PM 个人介绍: 弹丸粉 || 小说创作爱好者 || 撸猫狂魔(x || 生命的价值 ...
- Kubernetes探索学习005--Kubernetes的Controller模型和ReplicaSet伸缩
1.Kubernetes的controller pattern 需要认识到Kubernetes操作Pod的逻辑,都是由控制器来完成的. 查看之前写过的nginx-deployment的YAML文件 [ ...
- 我眼中的PD(产品狗)
以下内容可能引起您的不适(前方高能),请先移步科普: 产品经理为什么会存在? 本猿 -> web程序属 -> 前端开发种,从大森林迁徙到了小草原: 小草原物种稀缺,除了 程序猿,很难见到诸 ...
- 华策光通信: LED可见光通信室内定位项目获最具投资价值奖
3月21日上午,一场持续3个多小时的O2O领域的创业DemoShow在深圳科兴科学园会议中心激烈上演.来自华策光通信的基于LED可见光通信室内精准定位项目作为LED与室内定位领域的跨界融合项目经过精彩 ...
- second scrum meeting - 151026
摘要:这一周的工作其实进行的并没有很迅速~不过我们团队的每个人都在慢慢进行自己的工作,并且我们也完成了大致的页面设计,开发了主页面的框架,并且我们也会开始着手学习服务器的操作,还有更加完善主页面的框架 ...
- 课堂实践ASL博客
实践博客 二分法查找元素 1.首先定义三个位置min,mid,max 2.每次从所有元素所处位置的中间开始查找(所有元素必须以由小及大顺序排列完毕) 3.当中间元素大于所查找元素时,从中间元素(mid ...
- 20172319 实验二《Java面向对象程序设计》实验报告
20172319 2018.04.17-30 实验二<Java面向对象程序设计>实验报告 课程名称:<程序设计与数据结构> 学生班级:1723班 学生姓名:唐才铭 学生学号:2 ...
- 结对作业(web)
作业源代码地址:https://git.coding.net/mal123/arithmetic.git 网页版测试地址:http://47.93.197.5:8080/mal_war_explode ...
- HTTP压力测试工具wrk的安装及测试
本次在VMware虚拟机的CentOS6.3系统中进行安装wrk压测工具,具体如下: 一.预先安装需求项 为了安装顺利,不受权限的限制,首先可以把用户切换为root用户# su + 输入root用户对 ...
- laravel多环境配置(local,testing,production)
根据不同的环境有不同的配置,laravel中,可以把配置写到.env文件中 在系统中,可以使用env(key, "默认值")来获取env中的配置信息 在laravel中运行时,会运 ...