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


Q
Q
R
Q
Q

Sample Output


HINT

对于100%的数据,N≤10000,M≤10000,修改操作不多于1000次,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。

2016.3.2新加数据两组by Nano_Ape

Solution

先上简单的暴力,可以水过

#include <stdio.h>
#include <string.h>
#define M 1000010 inline int Rin() {
int x=,c=getchar(),f=;
for(; c<||c>; c=getchar())
if(c==)f=-;
for(; c>&&c<; c=getchar())
x=(x<<)+(x<<)+c-;
return x*f; } char c;
int g[M],n,m,a[M],top,x,y,i,mark[M],ans; int main() {
n=Rin(),m=Rin();
for(i=; i<=n; i++) {
a[i]=Rin();
if(!g[a[i]])
g[a[i]]=++top;
a[i]=g[a[i]]; }
while(m--) {
do c=getchar(); while(c!='Q'&&c!='R');
x=Rin(),y=Rin();
if(c=='Q') {
for(i=x,ans=; i<=y; i++)
if(mark[a[i]]!=m)
mark[a[i]]=m,ans++;
printf("%d\n",ans);
}
else {
if(!g[y])g[y]=++top;
a[x]=g[y];
}
}
return ;
}

一下是莫队的做法

otz menci

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define N 10010
#define M 1000010
#define RG register
#define inline __inline__ __attribute__((always_inline)) inline void Rin(RG int &x) {
x=;RG int c=getchar(),f=;
for(; c<||c>; c=getchar())
if(c==)f=-;
for(; c>&&c<; c=getchar())
x=(x<<)+(x<<)+c-;
x*=f; } int n,m,block_size,a[N],utop,qtop,ans[N],cnt[M]; struct Update {
int pos,eld,now; }U[N]; struct Request{
int tim,l,r,id; bool operator < (const Request &other)const {
if(l/block_size == other.l/block_size) {
if(r/block_size == other.r/block_size)
return tim < other.tim;
return r/block_size < other.r/block_size; }
return l/block_size < other.l/block_size; } }Q[N]; inline void prepare() {
static int nowlist[N];
memcpy(nowlist,a,sizeof a);
for(RG int i=; i<=utop; i++) {
U[i].eld=nowlist[U[i].pos];
nowlist[U[i].pos]=U[i].now; } } inline void extend(RG int &tmp,RG int pos,RG int dir) {
if(dir == ) {
if(++cnt[a[pos]]==)
tmp++; }
else
if(--cnt[a[pos]]==)
tmp--; } inline void modify(RG int &tmp,RG int T,RG int l,RG int r,RG int dir) {
RG Update x=U[T];
if(dir == ) {
a[x.pos]=x.now;
if(x.pos >=l && x.pos <= r) {
if(--cnt[x.eld]==)tmp--;
if(++cnt[x.now]==)tmp++; } }
else {
if(x.pos >=l && x.pos <= r) {
if(--cnt[x.now]==)tmp--;
if(++cnt[x.eld]==)tmp++; }
a[x.pos]=x.eld; } } inline void block_solve() {
for(RG int l=,r=,ans=,T=,i=; i<=qtop; i++) {
while(r < Q[i].r)extend(ans,++r,);
while(r > Q[i].r)extend(ans,r--,-); while(l > Q[i].l)extend(ans,--l,);
while(l < Q[i].l)extend(ans,l++,-); while(T < Q[i].tim)modify(ans,++T,l,r,);
while(T > Q[i].tim)modify(ans,T--,l,r,-);
:: ans[Q[i].id]=ans; } } int main() { Rin(n),Rin(m);
for(RG int i=; i<=n; i++)
Rin(a[i]);
for(RG int i=; i<=m; i++) {
RG char c;
do c=getchar(); while(c != 'Q'&&c != 'R');
if(c == 'Q') {
++qtop;
Rin(Q[qtop].l),Rin(Q[qtop].r);
Q[qtop].id=qtop;
Q[qtop].tim=utop; }
else {
++utop;
Rin(U[utop].pos),Rin(U[utop].now); } } prepare();
block_size=floor(pow(n,2.0/)+);
std::sort(Q+,Q++qtop);
block_solve(); for(RG int i=; i<=qtop;i++)
printf("%d\n",ans[i]);
return ; }

[bzoj2120][数颜色] (暴力 or 分块)的更多相关文章

  1. bzoj2120: 数颜色 [莫队][分块]

    Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜 ...

  2. BZOJ2120 数颜色 【带修莫队】

    BZOJ2120 数颜色 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到 ...

  3. bzoj2120 数颜色 莫队 带修改

    [bzoj2120]数颜色 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔 ...

  4. BZOJ2120 数颜色(带修改莫队)

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  5. BZOJ2120 数颜色(树套树)

    B. 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令:1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色 ...

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

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

  7. BZOJ2120 数颜色 —— 待修改莫队

    题目链接:https://vjudge.net/problem/HYSBZ-2120 2120: 数颜色 Time Limit: 6 Sec  Memory Limit: 259 MBSubmit:  ...

  8. [Bzoj2120]数颜色 (非正解 )(莫队)

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

  9. bzoj2120: 数颜色(BIT套主席树+set/分块)

    带修改的 HH的项链. 带修改考虑用BIT套主席树,查区间里有几个不同的数用a[i]上次出现的位置pre[i]<l的数有几个来算就好了. 考虑怎么修改.修改i的时候,我们需要改变i同颜色的后继的 ...

随机推荐

  1. cakephp , the subquery

    Cakephp 框架帮我们做了很多的工作,的确省了我们很多工作,提高了效率. 但是,碰到一些比较复杂的查询时,还是有些问题,官方的cookbook api 有说明一些详细的用法,但感觉还是不太够,有些 ...

  2. P8 Visible Lattice Points

    P8 Visible Lattice Points Time Limit:1000ms,     Memory Limit:65536KB Description A lattice point (x ...

  3. 使用JQuery结合HIghcharts实现从后台获取JSON实时刷新图表

    项目做了一个报表,可以实时的观察呼叫中心的电话访问量,之前的版本是使用JFreechart做的,使用一段时间后出现内存溢出,服务器的内存使用量会变得很大,所以改用Ajax前台加载数据的方式实现实时报表 ...

  4. iOS7以后的侧滑返回上一页

    我们知道,iOS7以后,导航控制器默认带了侧滑返回功能,但是仅限于屏幕边缘.而且在你自定义leftBarButtonItem等之后侧滑效果就会消失.这种问题怎么解决呢? 首先,我们先来看看系统的这种手 ...

  5. 设计一个 iOS 控件

    转载自:http://blog.csdn.net/zhangao0086/article/details/45622875 代码的等级:可编译.可运行.可测试.可读.可维护.可复用 前言 一个控件从外 ...

  6. BackTrack 5 R3 Metasploit更新方法及msfupdae,msconsole出错解决办法

    更新Metasploit最新版本: #cd /opt/metasploit/ #rm -rf msf3 #git clone --depth=1 git://github.com/rapid7/met ...

  7. ERROR security.UserGroupInformation

    [java] 15/11/14 12:58:19 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. ...

  8. java中单例设计模式

    在java中创建单例的方式主要有三种:饿汉式.懒汉式.登记式.以下内容均是摘抄自 http://blog.csdn.net/jason0539/article/details/23297037/ 一. ...

  9. 防止aspx木马的IIS SPY变态功能

    防止aspx木马的IIS SPY变态功能 如果服务器支持aspx语言,而且被上传了aspx木马,利用木马里面的IIS SPY 功能,可以读出IIS里面的所有用户的密码,包括用IIS做FTP的,也能读出 ...

  10. PAT (Advanced Level) 1029. Median (25)

    scanf读入居然会超时...用了一下输入挂才AC... #include<cstdio> #include<cstring> #include<cmath> #i ...