题目描述

墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问。墨墨会像你发布如下指令:

1、 Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔。

2、 R P Col 把第P支画笔替换为颜色Col。

为了满足墨墨的要求,你知道你需要干什么了吗?

输入输出格式

输入格式:

第1行两个整数N,M,分别代表初始画笔的数量以及墨墨会做的事情的个数。

第2行N个整数,分别代表初始画笔排中第i支画笔的颜色。

第3行到第2+M行,每行分别代表墨墨会做的一件事情,格式见题干部分。

输出格式:

对于每一个Query的询问,你需要在对应的行中给出一个数字,代表第L支画笔到第R支画笔中共有几种不同颜色的画笔。

输入输出样例

输入样例#1:

6 5
1 2 3 4 5 5
Q 1 4
Q 2 6
R 1 2
Q 1 4
Q 2 6
输出样例#1:

4
4
3
4

说明

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

来源:bzoj2120

本题数据为洛谷自造数据,使用CYaRon耗时5分钟完成数据制作。

裸的带修改的莫队

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<ctime>
using namespace std;
const int MAXN=;
static void read(int &n)
{
char c='+';int x=;bool flag=;
while(c<''||c>''){c=getchar();if(c=='-')flag=;}
while(c>=''&&c<=''){x=(x<<)+(x<<)+(c-);c=getchar();}
flag==?n=-x:n=x;
}
int n,m;
int a[MAXN];
struct CX
{
int l,r,id,tm;// tm上一次的更改操作
}cx[MAXN];
int cxnum;
struct GG
{
int pos,val,pre;
}gg[MAXN];
int ggnum;
int head[MAXN];
int where[MAXN];
int base;
int vis[MAXN];// 是否有更改操作
int color[MAXN];
int ans=;
int out[MAXN];
int comp(const CX &a,const CX &b)
{
if(where[a.l]==where[b.l])
return a.r<b.r;
else
return where[a.l]<where[b.l];
}
int calc(int x)
{
if(vis[x])
{
if(--color[a[x]]==)
ans--;
}
else
{
if(++color[a[x]]==)
ans++;
}
vis[x]=!vis[x];
}
void change(int p,int v)
{
if(vis[p])
{
calc(p);
a[p]=v;
calc(p);
}
else
a[p]=v;
} int main()
{
read(n);read(m);
for(int i=;i<=n;i++)
read(a[i]),head[i]=a[i];
base=sqrt(n);
for(int i=;i<=n;i++)
where[i]=(i-)/base+;
for(int i=;i<=m;i++)
{
char c;
int x,y;
cin>>c;
read(x);read(y);
if(c=='Q')// 查询
{
cxnum++;
cx[cxnum].l=x;
cx[cxnum].r=y;
cx[cxnum].id=cxnum;
cx[cxnum].tm=ggnum;
}
else
{
ggnum++;
gg[ggnum].pos=x;
gg[ggnum].val=y;
gg[ggnum].pre=head[x];
head[x]=y;
}
}
sort(cx+,cx+cxnum+,comp);
int l=,r=;
for(int i=;i<=cxnum;i++)
{
for(int j=cx[i-].tm+;j<=cx[i].tm;j++)
change(gg[j].pos,gg[j].val);
for(int j=cx[i-].tm;j>=cx[i].tm+;j--)
change(gg[j].pos,gg[j].pre);// 此处是pre,不是val!!!
for(;l<cx[i].l;l++)
calc(l);
for(;l>cx[i].l;l--)
calc(l-);
for(;r<cx[i].r;r++)
calc(r+);
for(;r>cx[i].r;r--)
calc(r);
out[cx[i].id]=ans;
}
for(int i=;i<=cxnum;i++)
printf("%d\n",out[i]);
return ;
}

P1903 【模板】分块/带修改莫队(数颜色)的更多相关文章

  1. AC日记——【模板】分块/带修改莫队(数颜色) 洛谷 P1903

    [模板]分块/带修改莫队(数颜色) 思路: 带修改莫队: (伏地膜xxy): 代码: #include <bits/stdc++.h> using namespace std; #defi ...

  2. 莫队 [洛谷2709] 小B的询问[洛谷1903]【模板】分块/带修改莫队(数颜色)

    莫队--------一个优雅的暴力 莫队是一个可以在O(n√n)内求出绝大部分无修改的离线的区间问题的答案(只要问题满足转移是O(1)的)即你已知区间[l,r]的解,能在O(1)的时间内求出[l-1, ...

  3. 【BZOJ】4129: Haruna’s Breakfast 树分块+带修改莫队算法

    [题意]给定n个节点的树,每个节点有一个数字ai,m次操作:修改一个节点的数字,或询问一条树链的数字集合的mex值.n,m<=5*10^4,0<=ai<=10^9. [算法]树分块+ ...

  4. 【BZOJ】3052: [wc2013]糖果公园 树分块+带修改莫队算法

    [题目]#58. [WC2013]糖果公园 [题意]给定n个点的树,m种糖果,每个点有糖果ci.给定n个数wi和m个数vi,第i颗糖果第j次品尝的价值是v(i)*w(j).q次询问一条链上每个点价值的 ...

  5. 洛谷 P1903 【模板】分块/带修改莫队(数颜色)

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

  6. 洛谷 P1903 BZOJ 2120 清橙 A1274【模板】分块/带修改莫队(数颜色)(周奕超)

    试题来源 2011中国国家集训队命题答辩 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔 ...

  7. luogu1903 【模板】分块/带修改莫队(数颜色)

    莫队算法模板 推荐阅读这篇博客 #include <algorithm> #include <iostream> #include <cstdio> #includ ...

  8. BZOJ2120/洛谷P1903 [国家集训队] 数颜色 [带修改莫队]

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

  9. 【Luogu】P1903数颜色(带修改莫队)

    题目链接 带修改莫队模板. 加一个变量记录现在是第几次修改,看看当前枚举的询问是第几次修改,改少了就改过去,改多了就改回来. 话说我栈用成队列了能过样例?!!!! 从此深信一句话:样例是出题人精心设计 ...

随机推荐

  1. sql变量需要加小括号

    declare @num int select top (@num) * from A --注意,使用变量来查询的时候,单个变量需要使用()

  2. Programming Recipes

    Recipes是从一本书上看来的,即有诀窍又有食谱的意思.这里想记一些工作中遇到的问题和解决方法,说决窍有点过了,说食谱照单做又不足,所以Recipe这个词两个意思都有混合起来正合适. 1.Windo ...

  3. C# 遍历对象下的 属性

    foreach (System.Reflection.PropertyInfo p in users.GetType().GetProperties()) { var xx = p.Name; var ...

  4. 优动漫PAINT之绘画助手软件简介

    在下载安装优动漫PAINT的时候,它会附带一个叫做绘画助手的一个小软件.绘画助手是一款用于PC端的创作辅助工具软件,针对画师们在绘画时可能遇到的各种问 题和需求,提供了作品保护.云配置.软件管理.色板 ...

  5. Map使用操作系统内存的情况

    public static void main(String[] args) { System.out.println("程序启动-->可用内存:"+(getSystemMe ...

  6. CentOS 7 yum 安装redis(更简单)

    一.安装redis 1.检查是否有redis yum 源 1 yum install redis 2.下载fedora的epel仓库 1 yum install epel-release 3.安装re ...

  7. centos7 选定默认启动内核,及删除无用内核

    #使用cat /boot/grub2/grub.cfg |grep menuentry 查看系统可用内核 [root@bigapp-slave27 ~]# cat /boot/grub2/grub.c ...

  8. 实验二:编写输出"Hello World!"

    1.首先打开eclipse这个软件,新建Java项目,执行“文件→ 新建→Java项目 ”菜单命令,打开新建Java对话框,在项目名的编辑框中输入项目名编写输出"Hello World!”, ...

  9. MySQL数据库唯一性设置(unique index)

    1,命令行操作 分为两种.一种是在建表时就想好要加上唯一性,另一种是在后期才发现需要设置唯一性. 建表时: CREATE TABLE `t_user` ( `Id` int(11) NOT NULL ...

  10. 洛谷 U249 匹配

    U249 匹配 题目描述 输入整数s和两个整数集合A和B,从这A和B中各取一个数,如果它们的和等于s,称为“匹配”.编程统计匹配的总次数 输入输出格式 输入格式: 第一行为三个整数s(0<s≤1 ...