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

6 5
1 2 3 4 5 5
Q 1 4
Q 2 6
R 1 2
Q 1 4
Q 2 6

Sample Output

4
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的更多相关文章

  1. BZOJ 2120 数颜色(带修改的莫队)

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MB Submit: 3478  Solved: 1342 [Submit][Status][Discus ...

  2. BZOJ 2120: 数颜色

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 3623  Solved: 1396[Submit][Status][Discuss] ...

  3. BZOJ 2120: 数颜色 分块

    2120: 数颜色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...

  4. 【BZOJ 2453|bzoj 2120】 2453: 维护队列 (分块+二分)

    2453: 维护队列 Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有 ...

  5. Bzoj 2120: 数颜色 && 2453: 维护队列 莫队,分块,bitset

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 2645  Solved: 1039[Submit][Status][Discuss] ...

  6. bzoj 2120 带修改莫队

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 7340  Solved: 2982[Submit][Status][Discuss] ...

  7. bzoj 2120 数颜色 (带修莫队)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间  l - r  内颜色的种类 ,R 单点修改 思路 ...

  8. BZOJ 2120 数颜色 (带修莫队)

    2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit: 6367  Solved: 2537[Submit][Status][Discuss] ...

  9. BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树

    https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...

随机推荐

  1. 精通Python爬虫-03-狩猎大师

    声明: 本系列文章原创于慕课网,作者秋名山车神,任何人不得以任何形式在不经作者允许的情况下,进行任何形式的印刷以及销售,转载需注明出处及此声明. 本系列文章更新至少每周一更,将涉及Python爬虫基础 ...

  2. [shell] 脚本之shift和getopts (转载)

    转载地址:http://www.361way.com/shell-shift-getopts/4973.html 建议不熟悉getopts的朋友,此篇要看完,getopts部分内容在原作者上面有改动. ...

  3. 北航MOOC系统Android客户端NABC

    北航MOOC手机客户端NABC分析 1) N (Need 需求) MOOC是Massive Open Online Course的缩写,通常被译为大型开放式网络课程,它最早在08年的时候由一位加拿大的 ...

  4. Java程序设计第四次实验报告

    北京电子科技学院(BESTI) 实     验    报     告 课程:java程序设计 班级:1352  姓名:何伟钦  学号:20135223 成绩:            指导教师:娄嘉鹏 ...

  5. 1001. A+B Format (20)的解题思路以及多源代码文件的尝试编写

    前言 这几天刚学了多源代码文件的编译,因为想尝试使用一下这种方法,所以想用此编写这次作业的程序.正好可以learning by doing,在做当中学习新知识.(编译器为Dev-C++) github ...

  6. fcn模型训练及测试

    1.模型下载 1)下载新版caffe: https://github.com/BVLC/caffe 2)下载fcn代码: https://github.com/shelhamer/fcn.berkel ...

  7. Oracle Instant Client

    下载地址: https://www.oracle.com/technetwork/database/database-technologies/instant-client/downloads/ind ...

  8. [华三] IPv6技术白皮书(V1.00)

    IPv6技术白皮书(V1.00) http://www.h3c.com/cn/d_200802/605649_30003_0.htm H3C S7500E IPv6技术白皮书 关键词:IPv6,隧道 ...

  9. docker weave安装

    1.升级内核到3.10.0以上,安装iproute22.安装 0.80版本:#wget -O /usr/local/bin/weave https://raw.githubusercontent.co ...

  10. C 语言assert使用

    1.assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include <assert.h>void assert( i ...