2453: 维护队列

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 578  Solved: 247
[Submit][Status][Discuss]

Description

你小时候玩过弹珠吗?
小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N。为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少。当然,A有时候会依据个人喜好,替换队列中某个弹珠的颜色。但是A还没有学过编程,且觉得头脑风暴太浪费脑力了,所以向你来寻求帮助。

Input

输入文件第一行包含两个整数N和M。
第二行N个整数,表示初始队列中弹珠的颜色。
接下来M行,每行的形式为“Q L R”或“R x c”,“Q L R”表示A想知道从队列第L个弹珠到第R个弹珠中,一共有多少不同颜色的弹珠,“R x c”表示A把x位置上的弹珠换成了c颜色。

Output

对于每个Q操作,输出一行表示询问结果。

Sample Input

2 3
1 2
Q 1 2
R 1 2
Q 1 2

Sample Output

2
1

HINT

对于100%的数据,有1 ≤ N ≤ 10000, 1 ≤ M ≤ 10000,小朋友A不会修改超过1000次,所有颜色均用1到10^6的整数表示。

Source

 #include<bits/stdc++.h>
using namespace std;
#define MAXN 10010
#define MAXM 1000010
int n,a[MAXN],last[MAXN],pre[MAXM],block,pos[MAXN],h[MAXN];
int read()
{
int s=,fh=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')fh=-;ch=getchar();}
while(ch>=''&&ch<=''){s=s*+(ch-'');ch=getchar();}
return s*fh;
}
void cl(int k)
{
int l=(k-)*block+,r=min(n,k*block),i;
for(i=l;i<=r;i++)a[i]=last[i];
sort(a+l,a+r+);
}
void Change(int x,int c)
{
int i,t;
for(i=;i<=n;i++)pre[h[i]]=;
h[x]=c;
for(i=;i<=n;i++)
{
t=last[i];
last[i]=pre[h[i]];
if(t!=last[i])cl(pos[i]);
pre[h[i]]=i;
}
}
int Find(int k,int ll)
{
int l=(k-)*block+,r=min(k*block,n),mid,t=;
while(l<=r)
{
mid=(l+r)/;
if(a[mid]>=ll)r=mid-;
else if(a[mid]<ll)t=mid,l=mid+;
}
if(t==)return ;
else return t-((k-)*block+)+;
}
int Query(int l,int r)
{
int ans=,i;
if(pos[l]==pos[r])
{
for(i=l;i<=r;i++)if(last[i]<l)ans++;
}
else
{
for(i=l;i<=pos[l]*block;i++)if(last[i]<l)ans++;
for(i=(pos[r]-)*block+;i<=r;i++)if(last[i]<l)ans++;
for(i=pos[l]+;i<=pos[r]-;i++)ans+=Find(i,l);
}
return ans;
}
int main()
{
int M,i,m,s1,s2;
char fh[];
n=read();M=read();
block=(int)sqrt(n);
memset(last,,sizeof(last));
memset(pre,,sizeof(pre));
for(i=;i<=n;i++)
{
h[i]=read();
last[i]=pre[h[i]];
pre[h[i]]=i;
pos[i]=(i-)/block+;
}
if(block*block==n)m=n/block;
else m=n/block+;
for(i=;i<=m;i++)cl(i);
for(i=;i<=M;i++)
{
scanf("\n%s",fh);s1=read();s2=read();
if(fh[]=='Q')
{
printf("%d\n",Query(s1,s2));
}
else Change(s1,s2);
}
return ;
}
 #include<bits/stdc++.h>
using namespace std;
int a[];
bitset<> vis;
int main()
{
int n,m,i,l,r,sum,j;
char fh;
scanf("%d %d",&n,&m);
for(i=;i<=n;i++)scanf("%d",&a[i]);
for(i=;i<=m;i++)
{
scanf("\n%c %d %d",&fh,&l,&r);
if(fh=='Q')
{
vis.reset();
sum=;
for(j=l;j<=r;j++)if(vis[a[j]]==){sum++;vis[a[j]]=;}
printf("%d\n",sum);
}
else
{
a[l]=r;
}
}
return ;
}

Bzoj 2453: 维护队列 && Bzoj 2120: 数颜色 分块,bitset的更多相关文章

  1. bzoj 2453 : 维护队列 带修莫队

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 952  Solved: 432[Submit][Status][Discuss] ...

  2. bzoj 2453: 维护队列

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1079  Solved: 503[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 维护队列 | 分块

    题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2453 题解: 考虑维护每个位置的颜色上一次出现在哪里,计为pre[i],在询问l到r的时候, ...

  5. BZOJ.2453.维护队列([模板]带修改莫队)

    题目链接 带修改莫队: 普通莫队的扩展,依旧从[l,r,t]怎么转移到[l+1,r,t],[l,r+1,t],[l,r,t+1]去考虑 对于当前所在的区间维护一个vis[l~r]=1,在修改值时根据是 ...

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

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

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

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

  8. 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法

    2453: 维护队列 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 653  Solved: 283[Submit][Status][Discuss] ...

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

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

随机推荐

  1. ISO 学习笔记 2015-03-15

    Objective--C 一 关键字 @property 定义变量函数 @synthesize 实现变量函数 二 函数 alloc 分配内存 init 初始化 new 替代上面两个函数 分配内存,并且 ...

  2. Mantle 简单教程

    Mantle可以很方便的去书写一个模型层的代码. 使用它可以很方便的去反序列化JSON或者序列化为JSON(需要在MTLModel子类中实现<MTLJSONSerializing>协议) ...

  3. linux中python环境搭建及升级后yum不可用解决方案

    1.1 LinuxCentOS 为例.1.1.1 升级 Python(1) 下载 Python 版本$ wget https://www.python.org/ftp/python/2.7.11/Py ...

  4. javascript 写农场迭代

    /** * 农场一头小母牛 * 每年生头小母牛 * 母牛五岁产母牛 * 二十年上多少牛 */ 划分程序,母牛只管自己的年龄能不能产牛仔,母牛是model同时也是工厂 农场只管养牛,收获新牛. 一年一个 ...

  5. Poco之ftp获取文件列表以及下载文件

    #include <iostream>#include <string>#include <vector>#include <algorithm>#in ...

  6. Leetcode 解题 Median of Two sorted arrays

    题目:there are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...

  7. 坑爹的NSIS转义符:$ (在NSIS的MessageBox中写换行文字)

    最近的项目中,发现了NSIS一个比较坑的地方:$ 不但是变量常量的开头,还是一个转义字符. 大家有没有发现,NSIS写的脚本中,如果要让弹出消息框中的文字带换行功能,“\r\n” 是不是很不管用呢? ...

  8. Computer Talker with C# z

    Using the Code Add a textbox named 'txtWords' to a form. Add a button named 'btnSpeak' to a form. Ad ...

  9. leetcode第八题 String to Integer (atoi) (java)

    String to Integer (atoi) time=272ms   accepted 需考虑各种可能出现的情况 public class Solution { public int atoi( ...

  10. chrome浏览器默认样式覆盖input背景

    问题描述:input表单添加了背景图片,结果自动填充是,编程了一个淡黄色矩形方框. 解决方案:网上查询了很多的解决方式,基本都不管用,这里我简单说两个. 1.去除黄色背景 input:-webkit- ...