【bzoj2120】 数颜色
http://www.lydsy.com/JudgeOnline/problem.php?id=2120 (题目链接)
题意
给出一个n个数,m个询问,每次询问一个区间或修改一个数,求区间内不同的数有多少个。
solution
分块。
用数组${b}$记录当前位置${i}$所对应的颜色之前出现在哪一个块中,每一个块中的${b}$自行排序,查询区间${[l,r]}$时就二分在块${i}$中查找${l}$即可。
每次修改就暴力nlogn重新构块。
代码
// bzoj2120
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<vector>
#define MOD 1000000007
#define inf 2147483640
#define LL long long
#define free(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
using namespace std;
inline LL getint() {
LL x=0,f=1;char ch=getchar();
while (ch>'9' || ch<'0') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
} const int maxn=1000010;
int head[maxn],a[maxn],b[maxn],pre[maxn],pos[maxn],n,m,q,block; void reset(int x) {
int l=(x-1)*block+1,r=min(x*block,n);
for (int i=l;i<=r;i++) pre[i]=b[i];
sort(pre+l,pre+r+1);
}
void build() {
for (int i=1;i<=n;i++) {
b[i]=head[a[i]];
head[a[i]]=i;
pos[i]=(i-1)/block+1;
}
for (int i=1;i<=m;i++) reset(i);
}
int find(int x,int v) {
int l=(x-1)*block+1,r=min(x*block,n);
int f=l;
while (l<=r) {
int mid=(l+r)>>1;
if (pre[mid]<v) l=mid+1;
else r=mid-1;
}
return l-f;
}
int query(int l,int r) {
int ans=0;
if (pos[l]==pos[r]) {
for (int i=l;i<=r;i++) if (b[i]<l) ans++;
}
else {
for (int i=l;i<=block*pos[l];i++) if (b[i]<l) ans++;
for (int i=block*(pos[r]-1)+1;i<=r;i++) if (b[i]<l) ans++;
}
for (int i=pos[l]+1;i<pos[r];i++) ans+=find(i,l);
return ans;
}
void modify(int x,int y) {
for (int i=1;i<=n;i++) head[a[i]]=0;
a[x]=y;
for (int i=1;i<=n;i++) {
int t=b[i];
b[i]=head[a[i]];
if (t!=b[i]) reset(pos[i]);
head[a[i]]=i;
}
}
int main() {
scanf("%d%d",&n,&q);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
block=int(sqrt(n));
if (n%block>0) m=n/block+1;
else m=n/block;
build();
while (q--) {
char ch[10];
int x,y;
scanf("%s%d%d",ch,&x,&y);
if (ch[0]=='Q')
printf("%d\n",query(x,y));
else modify(x,y);
}
return 0;
}
【bzoj2120】 数颜色的更多相关文章
- BZOJ2120 数颜色 【带修莫队】
BZOJ2120 数颜色 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到 ...
- bzoj2120 数颜色 莫队 带修改
[bzoj2120]数颜色 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔 ...
- BZOJ2120 数颜色 【带修改莫队】
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MB Submit: 6579 Solved: 2625 [Submit][Status][Discus ...
- BZOJ2120 数颜色 —— 待修改莫队
题目链接:https://vjudge.net/problem/HYSBZ-2120 2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: ...
- BZOJ2120 数颜色(树套树)
B. 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令:1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色 ...
- [Bzoj2120]数颜色 (非正解 )(莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6286 Solved: 2489[Submit][Status][Discuss] ...
- BZOJ2453维护队列&&BZOJ2120数颜色
2016-05-28 11:20:22 共同的思路: 维护某种颜色上一次在哪里出现pre,可以知道当pre<询问的l时更新答案 块内按照pre排序 修改的时候重新O(n)扫一遍,如果和之前的不一 ...
- bzoj2120: 数颜色(BIT套主席树+set/分块)
带修改的 HH的项链. 带修改考虑用BIT套主席树,查区间里有几个不同的数用a[i]上次出现的位置pre[i]<l的数有几个来算就好了. 考虑怎么修改.修改i的时候,我们需要改变i同颜色的后继的 ...
- BZOJ2120 数颜色(带修改莫队)
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- BZOJ2120 数颜色
Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成 一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同 ...
随机推荐
- Codevs 1860 最大数 string大法好,STL万岁。。
题目描述 Description 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 输入描述 Input Description 第一行一个正整数n. 第二行n个正整数,空格隔开 ...
- Android动画学习笔记-Android Animation
Android动画学习笔记-Android Animation 3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...
- codevs http://www.codevs.cn/problem/?problemset_id=1 循环、递归、stl复习题
12.10高一练习题 1.要求: 这周回顾复习的内容是循环.递归.stl. 不要因为题目简单就放弃不做,现在就是练习基础. 2.练习题: (1)循环 题目解析与代码见随笔分类 NOI题库 htt ...
- SQL Server读懂语句运行的统计信息 SET STATISTICS TIME IO PROFILE ON
对于语句的运行,除了执行计划本身,还有一些其他因素要考虑,例如语句的编译时间.执行时间.做了多少次磁盘读等. 如果DBA能够把问题语句单独测试运行,可以在运行前打开下面这三个开关,收集语句运行的统计信 ...
- FineUI参考手册(离线版)现已免费提供下载!
http://fineui.com/bbs/forum.php?mod=viewthread&tid=3473
- DOM与CSS样式表
在前文 <DOM与元素节点内联样式>中我们了解了用 DOM 提供的接口操作元素节点内联样式的方法,今天我们来学习一下如何用 DOM 操作 CSS 样式表. CSS 样式表概况 通过使用 H ...
- 基于DDD的.NET开发框架 - ABP模块设计
返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...
- Windows Phone 8 下载文件进度
后台代码: public partial class MainPage : PhoneApplicationPage { private long siz; private long speed; p ...
- 什么是viewport,为什么需要viewport
viewport:视口,视觉窗口,显示区域.在显示面积上手机屏幕相对桌面显示器要小很多,在几年前(现在也如此)大部分网站都是为桌面显示器浏览而设计,很少考虑到适应手机屏幕,所以如果用手机浏览大多网站时 ...
- 拼图游戏(js,C#,java三种语言)
<html> <head> <meta charset="utf-8"> <style type="text/css" ...