【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支画笔中共有几种不同 ...
随机推荐
- MathType 公式后的空格问题
注册表编辑器修改 Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Design Science\DSMT6\WordC ...
- Codevs 1506 传话(floyd大法好)。
1506 传话 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 一个朋友网络,如果a认识b,那么如果a第 ...
- sudo su权限案例
一 控制sudo: 允许执行所有命令,排除某几个命令(带参数) lanny ALL=(ALL) NOPASSWD:ALL, !/bin/su - root, !/usr/sbin/visudo 如果需 ...
- Number of Digit One
Given an integer n, count the total number of digit 1 appearing in all non-negative integers less th ...
- npm中package.json详解
通常我们使用npm init命令来创建一个npm程序时,会自动生成一个package.json文件.package.json文件会描述这个NPM包的所有相关信息,包括作者.简介.包依赖.构建等信息,格 ...
- 如何用 fiddler 调试线上代码
有时代码上线了,突然就碰到了坑爹的错误.或者有时看别人家线上的代码,对于一个文件想 fork 下来试试效果又不想把全部文件拉到本地,都可以使用 fiddler 的线上调试功能. 比方说我们打开携程的首 ...
- unity3d 我的面试经历
昨天在上海的一家公司面试成功了 这是我第一次面试,也是我的第一份工作 先上我的简历给大家参考下吧 个人简历 个人信息: 姓 名: 廖旭升 学 历: 无 民 族: 汉 ...
- ecshop 签名
先从index.php主页开始 页面关键字 {$keywords } 页面标题 {$page_title} 产品分类 父分类列表 {foreach from=$categories item=cat ...
- 软件工程(FZU2015)学生博客列表(最终版)
FZU:福州大学软件工程 张老师的博客:http://www.cnblogs.com/easteast/ 经过前两周选课,最后正式选上课程的所有学生博客如下: 序号 学号后3位 博客 1 629 li ...
- 快速向表中插入大量数据Oracle中append与Nologging
来源于:http://blog.sina.com.cn/s/blog_61cd89f60102e7gi.html 当需要对一个非常大的表INSERT的时候,会消耗非常多的资源,因为update表的时候 ...