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。

 
正解是什么?我不知道
参考hzwer的思路,这题可以暴力分块,因为修改少。
记录每个颜色的上一次出现在那,然后排个序。边上暴力查找比上一个比l小的点,块内二分
话说lower_bound是查询前闭后开的区间。。。
 #include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=;
int bel[N],last[],size[N],pre[N],q[N],a[N],c[N];
int num,n,m,l,r,p,col,ans; void build(){
int block=sqrt(n);
for(int i=;i<=n;i++){
bel[i]=(i-)/block+;
if(bel[i]>num) num=bel[i];
size[bel[i]]++;
pre[i]=last[a[i]];
c[i]=pre[i];
last[a[i]]=i;
}
} void reset(int x){
for(int i=q[x-]+;i<=q[x];i++) pre[i]=c[i];
sort(pre+q[x-]+,pre+q[x]+);
} int find(int x,int y){
int tmp=lower_bound(pre+q[x-]+,pre+q[x]+,y)-pre-q[x-]-;
return tmp;
} int ask(int l,int r){
if(bel[l]==bel[r]){
for(int i=l;i<=r;i++) if(c[i]<l) ans++;
}
else{
for(int i=l;i<=q[bel[l]];i++) if(c[i]<l) ans++;
for(int i=q[bel[r]-]+;i<=r;i++)
if(c[i]<l) ans++;
}
for(int i=bel[l]+;i<bel[r];i++) ans+=find(i,l);
return ans;
} void change(int x,int y){
for(int i=;i<=n;i++) last[a[i]]=;
a[x]=y;
for(int i=;i<=n;i++){
int t=c[i];
c[i]=last[a[i]];
if(t!=c[i]) reset(bel[i]);
last[a[i]]=i;
}
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
build();
for(int i=;i<=num;i++) q[i]=q[i-]+size[i];
for(int i=;i<=num;i++)
reset(i);
char s[];
for(int i=;i<=m;i++){
scanf("%s",s);
if(s[]=='Q'){
ans=;
scanf("%d%d",&l,&r);
printf("%d\n",ask(l,r));
}
else{
scanf("%d%d",&p,&col);
change(p,col);
}
}
}

【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 2120: 数颜色 && 2453: 维护队列 莫队,分块,bitset

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

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

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

  6. BZOJ 2120 数颜色 【带修改莫队】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2120 2120: 数颜色 Time Limit: 6 Sec  Memory Limit: ...

  7. bzoj 2120 数颜色 题解

    转载请注明:http://blog.csdn.net/jiangshibiao/article/details/23990489 [原题] 2120: 数颜色 Time Limit: 6 Sec  M ...

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

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

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

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2120 [题目大意] 给出一颜色序列,每次可以修改一个位置的颜色或者询问一个区间不同颜色 ...

  10. BZOJ 2120 数颜色&2453 维护队列 [带修改的莫队算法]【学习笔记】

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

随机推荐

  1. TortoiseSVN文件夹图标不显示的解决方法

    是否遇到过TortoiseSVN安装好后,发现文件夹的图标还是Windows默认的图标? 下面通过简单几步解决图标不显示的问题. 1/6 "Win + R"打开运行框,输入&quo ...

  2. Windows phone 8 学习笔记(7) 设备(转)

    本节主要涉及到 Windows phone 8 手机支持的各类设备,包括相机.设备状态,振动装置等.还有各类感应器,包括磁力计.加速度器和陀螺仪.通过设备状态可以获取内存.硬件.电源.键盘等状态:通过 ...

  3. 【C++面试】常考题复习:排序算法

    // Sort.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdlib.h> /*********** ...

  4. ArrayList总结

    ArrayList 1.extends AbstractList 实现List<E>->Collection<e>->Iterable,RandomAccess,S ...

  5. leetcode 121

    121. Best Time to Buy and Sell Stock Say you have an array for which the ith element is the price of ...

  6. 定时器Timer

    定时器类:Timer 构造函数:Timer(TimerCallback callback, object state, uint dueTime, uint period) callback:中断处理 ...

  7. ububtu 14.04 问题集合

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4168168.html 1.Chromium 中的flash插件问题: sudo apt-ge ...

  8. Windows服务中用Timer和线程两种方式来执行定时任务

    在Service服务文件夹下新建Windows服务 - TestService

  9. Html辅助方法(分页、下拉框)

    引用命名空间: using System.Text; using System.Web.Mvc; Html分页方法 #region 分页Html辅助方法 /// <summary> /// ...

  10. SQL Server 基础:Cast和Convert的区别

    CAST 和 CONVERT 都可以将某种数据类型的表达式显式转换为另一种数据类型. 语法: CAST ( expression AS data_type ) CONVERT (data_type[( ...