2120: 数颜色

Time Limit: 6 Sec  Memory Limit: 259 MB
Submit: 2645  Solved: 1039
[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

Source

 题解:
好像可以用bitset。。。
 #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 ;
}
直接用莫队也可以。。。
好像重题了(见Bzoj2453)>_<
好像和 HH的项链 几乎一样。。。
 #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 ;
}

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

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

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

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

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

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

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

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

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

  5. bzoj 2120: 数颜色【带修改莫队】

    比较裸的带修莫队,对每个修改操作记一下它修改的位置修改前的颜色 然后正常莫队,每次对修改操作时间倒流一下即可 #include<iostream> #include<cstdio&g ...

  6. Luogu P1903 BZOJ 2120 数颜色 带修改的莫队

    https://www.luogu.org/problemnew/show/P1903 之前切过这道题,复习莫队再切一遍,不过我之前写的是主席树和树状数组,也不知道我当时怎么想的…… 这个题卡常我没写 ...

  7. 【BZOJ】2120: 数颜色 带修改的莫队算法

    [题意]给定n个数字,m次操作,每次询问区间不同数字的个数,或修改某个位置的数字.n,m<=10^4,ai<=10^6. [算法]带修改的莫队算法 [题解]对于询问(x,y,t),其中t是 ...

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

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

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

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

随机推荐

  1. ORACLE数据库闪回日志写满

    网站页面无法显示完整.检查web服务是正常的,所以可能是ORACLE数据库出了问题. 首先检查闪回日志写满 然后检查归档日志文件写满的缘故了.使用以下几个命令可以看出当前归档日志文件的使用情况: se ...

  2. linux删除、读取文件原理

    linux删除文件原理 LINUX的文件名是存在父目录的block里面,并指向这个文件额inode节点,这个文件的inode节点再标记指向存放这个文件的block的数据块.我们删除一个文件,实际上并不 ...

  3. ubuntu thinkphp pathinfo 404等问题

    这个问题 困扰了我一天,由于对nginx的配置文件中的各种变量不懂.配置起来很麻烦,从网上搜索的,感觉合适自己的不多!!! 找啊找啊..终于找一篇!!!! 我的环境: php ubuntu 12.04 ...

  4. js获取json数据

    var json = {  contry:{ area:{ man:"12万",  women:"10万" } } };//方式一:使用eval解析  var  ...

  5. PHPUnit初试

    先测试了一下加减,检查一下环境,又调用函数测试了服务器名. 源代码: class DemoController extends \Think\Controller { /** * @assert (5 ...

  6. php实现手机拍照上传头像功能

    现在手机拍照很火,那么如何使用手机拍照并上传头像呢?原因很简单,就是数据传递,首先手机传递照片信息,这个就不是post传递 也不是get函数传递, 这个另外一种数据格式传递,使用的是$GLOBALS ...

  7. HTML5:一个拖拽网页元素的例子

    关键字:HTML5, Drag&Drop, JavaScript, CSS 运行环境:Chrome <!DOCTYPE html> <html> <head> ...

  8. win7系统cocos2dx 3.4 绑定自定义类到Lua

    Cocos2d-x 3.0开始使用bindings-generator来生成c++类的lua绑定.bindings-generator基于tolua++,通过配置tools/tolua中的ini文件以 ...

  9. SDWebImage 详解

    一.SDWebImage介绍 1.在项目的开发过程中,我们经常会用到异步加载图片的功能,先从网络上异步下载图片,然后通过UIImageView显示在屏幕上.这是一个经常使用的功能,基本上所有的联网应用 ...

  10. IOS7,做为开发者,你需要知道的变更

    IOS7即将发布,那么我们需要做些什么呢? 升级你的程序Icon至 120*120 更新一张包含状态栏大小的闪屏图片 还有些什么东西呢? IOS7中需要使用更加扁平化的设计,所以BUTTON的图片,边 ...