Bzoj 2120: 数颜色 && 2453: 维护队列 莫队,分块,bitset
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
1 2 3 4 5 5
Q 1 4
Q 2 6
R 1 2
Q 1 4
Q 2 6
Sample Output
4
3
4
HINT
对于100%的数据,N≤10000,M≤10000,修改操作不多于1000次,所有的输入数据中出现的所有整数均大于等于1且不超过10^6。
2016.3.2新加数据两组by Nano_Ape
Source
#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 ;
}
#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的更多相关文章
- BZOJ 2120 数颜色&2453 维护队列 [带修改的莫队算法]【学习笔记】
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 3665 Solved: 1422[Submit][Status][Discuss] ...
- BZOJ 2120 数颜色 【带修改莫队】
任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=2120 2120: 数颜色 Time Limit: 6 Sec Memory Limit: ...
- BZOJ 2120 数颜色(带修改莫队)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2120 [题目大意] 给出一颜色序列,每次可以修改一个位置的颜色或者询问一个区间不同颜色 ...
- BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...
- bzoj 2120: 数颜色【带修改莫队】
比较裸的带修莫队,对每个修改操作记一下它修改的位置修改前的颜色 然后正常莫队,每次对修改操作时间倒流一下即可 #include<iostream> #include<cstdio&g ...
- Luogu P1903 BZOJ 2120 数颜色 带修改的莫队
https://www.luogu.org/problemnew/show/P1903 之前切过这道题,复习莫队再切一遍,不过我之前写的是主席树和树状数组,也不知道我当时怎么想的…… 这个题卡常我没写 ...
- 【BZOJ】2120: 数颜色 带修改的莫队算法
[题意]给定n个数字,m次操作,每次询问区间不同数字的个数,或修改某个位置的数字.n,m<=10^4,ai<=10^6. [算法]带修改的莫队算法 [题解]对于询问(x,y,t),其中t是 ...
- Bzoj 2453: 维护队列 && Bzoj 2120: 数颜色 分块,bitset
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 578 Solved: 247[Submit][Status][Discuss] ...
- BZOJ 2120 数颜色(带修改的莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MB Submit: 3478 Solved: 1342 [Submit][Status][Discus ...
随机推荐
- 百度UEditor(富文本编辑器)的基础用法
百度的这个编辑器挺强大的,这里只是用他的文本功能,没有介绍上传图片视频的. 我用是的SSH来写的项目. 1. 把下载的UEditor(ueditor1_4_3_1-utf8-jsp)解压后全部复制到W ...
- (WinForm)FormBorderStyle属性
此属性就是获取或设置窗体的边框样式,默认值为 FormBorderStyle.Sizable.共7个值. 属性 意义 None 无边框 FixedSingle 固定的单行边框 Fixed3D 固定的三 ...
- 『奇葩问题集锦』Cannot find module 'webpack/lib/node/NodeTemplatePlugin'
第一步:npm config get prefix ,获取输出path“C:\Users\jaxGu\AppData\Roaming\npm”加上"\node_modules"用于 ...
- thinkphp分页格式的完全自定义,直接输入数字go到输入数字页
实现分页效果如下: 以下标注红色字体的为重点 找到文件page.class.php在ThinkPHP/Library/Thinkpage.class.php并打开文件,复制函数show,在本文件中 ...
- 犯这个错误的肯定不止我一个 关于File
File.Create(string filePath)这种用法所有人都知道,这两天用到的时候却发现一个问题. 需要先判断文件是否存在,如果不存在则创建文件,然后向该文件写入数据,后续定时Append ...
- 新浪微博登录接口(PHP版)
CI框架下 新浪微博登录接口完整版说明:本贴只适合CI框架.功能实现:登录接口跳转链接成功,获取用户信息(包括最重要的u_id)成功,将用户与本地平台连接起来,用户登录成功后信息的存储,本地数据库第三 ...
- linux 中 ‘|’的作用
利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入.连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入 ...
- source insight添加汇编文件.s
(1) 做ARM嵌入式开发时,有时得整汇编代码,但在SIS里建立PROJECT并ADD TREE的时候,根据默认设置并不会把该TREE里面所有汇编文件都包含进来,默认只加了.inc和.asm后缀的, ...
- centos6.5搭建vpn服务器
1 安装ppp yum install -y ppp 2 安装pptpd yum install pptpd // rpm -Uvh http://poptop.sourceforge.net ...
- Codeforces Round #316 div2
一场充满血腥hack之战!!! Problem_A: 题意: n个候选人在m个城市进行投票,每个城市选出票数最多的一个候选人为城市候选人,如果票数相同,则取编号小的候选人. 再从这m个城市候选人中选出 ...