bzoj 2120
2120: 数颜色
Time Limit: 6 Sec Memory Limit: 259 MB
Submit: 6430 Solved: 2562
[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
//注意到颜色范围只有1e6,修改操作不超过1000。分块,用pre[i]记录col[i]上一次出现的位置,每一块中的pre数组
//从小到大排序,然后二分找到有几个的pre在询问区间的左端点的左边就是有几种数,两边的区间暴力找。修改时暴力
//修改,更新pre,nex。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=;
int n,m,B,cnt,block[MAXN],pre[MAXN],nex[MAXN],last[],p[MAXN],col[MAXN];
void resort(int x)
{
int l=(x-)*B+,r=min(n,x*B);
for(int i=l;i<=r;i++) p[i]=pre[i];
sort(p+l,p+r+);
}
void build()
{
for(int i=;i<=n;i++){
scanf("%d",&col[i]);
pre[i]=last[col[i]];
if(last[col[i]]) nex[last[col[i]]]=i;
last[col[i]]=i;
block[i]=(i-)/B+;
}
for(int i=;i<=cnt;i++) resort(i);
}
int find(int x,int ql)
{
int l=(x-)*B+,r=x*B,ans=;
int st=l;
while(l<=r){
int mid=(l+r)>>;
if(p[mid]<ql) { ans=mid-st+;l=mid+; }
else r=mid-;
}
return ans;
}
int query(int ql,int qr)
{
int s=;
for(int i=ql;i<=min(n,block[ql]*B);i++)
if(pre[i]<ql) s++;
if(block[ql]!=block[qr]){
for(int i=(block[qr]-)*B+;i<=qr;i++)
if(pre[i]<ql) s++;
}
for(int i=block[ql]+;i<block[qr];i++) s+=find(i,ql);
return s;
}
void update(int x,int y)
{
col[x]=y;
if(nex[x]) { pre[nex[x]]=pre[x];resort(block[nex[x]]); }
if(pre[x]) nex[pre[x]]=nex[x];
int pr=,ne=;
for(int i=x-;i>=;i--)
if(col[i]==y) { pr=i;break; }
for(int i=x+;i<=n;i++)
if(col[i]==y) { ne=i;break; }
pre[x]=pr;nex[x]=ne;
resort(block[x]);
if(pr) nex[pr]=x;
if(ne) { pre[ne]=x;resort(block[ne]); }
}
int main()
{
//freopen("in.txt","r",stdin);
memset(last,,sizeof(last));
scanf("%d%d",&n,&m);
B=sqrt(n);
cnt=n/B+(n%B!=);
build();
while(m--){
char ch[];
int x,y;
scanf("%s%d%d",ch,&x,&y);
if(ch[]=='Q') printf("%d\n",query(x,y));
else update(x,y);
}
return ;
}
bzoj 2120的更多相关文章
- BZOJ 2120 数颜色(带修改的莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MB Submit: 3478 Solved: 1342 [Submit][Status][Discus ...
- BZOJ 2120: 数颜色
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 3623 Solved: 1396[Submit][Status][Discuss] ...
- BZOJ 2120: 数颜色 分块
2120: 数颜色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...
- 【BZOJ 2453|bzoj 2120】 2453: 维护队列 (分块+二分)
2453: 维护队列 Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有 ...
- Bzoj 2120: 数颜色 && 2453: 维护队列 莫队,分块,bitset
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 2645 Solved: 1039[Submit][Status][Discuss] ...
- bzoj 2120 带修改莫队
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 7340 Solved: 2982[Submit][Status][Discuss] ...
- bzoj 2120 数颜色 (带修莫队)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间 l - r 内颜色的种类 ,R 单点修改 思路 ...
- BZOJ 2120 数颜色 (带修莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6367 Solved: 2537[Submit][Status][Discuss] ...
- BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节 ...
随机推荐
- tee命令详解
基础命令学习目录首页 参考:http://man.linuxde.net/tee tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin.简单的说就是把数据重 ...
- tty命令详解
基础命令学习目录首页 原文链接:http://blog.chinaunix.net/uid-9525959-id-2001836.html [功能] 打印连接到标准输入的终端的文件名. [描述] ...
- Scrum立会报告+燃尽图(十二月五日总第三十六次):Final阶段分配任务
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://git.coding.net/zhang ...
- 在js中保存数据
localStorage: localStorage.setItem("key", "value"); localStorage.getItem("k ...
- Daily Scrumming* 2015.11.2(Day 14)
一.今明两天任务表 Member Today’s Task Tomorrow’s Task 江昊 实现前后端整合 继续实现前后端整合 杨墨犁 修改好首页 开始实现社团页 付帅 测试api 继续测试并完 ...
- Sprint计划表
Sprint会议计划 一.Sprint 需求 准备环节:小组成员利用周六周日在网上查阅Android开发的教程,练习开发一些简单的小程序,具备一定的开发能力,在电脑上搭建Android开发环境,做好 ...
- 团队作业7——第二次项目冲刺(Beta版本12.09——12.10)
1.当天站立式会议照片 本次会议在5号公寓3楼召开,本次会议内容:①:熟悉每个人想做的模块.②:根据项目要求还没做的完成. 2.每个人的工作 经过会议讨论后确定了每个人的分工 组员 任务 陈福鹏 倒计 ...
- 软工网络15团队作业8——Beta阶段冲刺合集
博客链接集合 Beta阶段敏捷冲刺计划博客 Beta阶段冲刺第一天 Beta阶段冲刺第二天 Beta阶段冲刺第三天 Beta阶段冲刺第四天 Beta阶段冲刺第五天
- VNC Server (CentOS 7 GNOME)
1. 安装VNC服务 sudo yum install tigervnc-server -y 2. 启动VNC服务,设置密码,然后停止 vncserver :1 vncserver -kill :1 ...
- [Linux] 关于 history 命令的简单使用
1. 如果不想记录当前 会话操作的命令的话 可以使用命令 set +o history 但是这个命令有一个坏处, 他自己被记住了... 2. 还有一个办法 就是 在退出登录之前执行命令 history ...