BZOJ2120:数颜色(分块版)
浅谈分块:https://www.cnblogs.com/AKMer/p/10369816.html
题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=2120
树套树做法:https://www.cnblogs.com/AKMer/p/10189008.html
对于每个块维护块内\(pre\)上升的数组即可,每次查找直接\(lower\) \(bound\)一下,其它的跟树套树版的没什么区别。
时间复杂度:\(O(nlog\sqrt{n}+m\sqrt{n}log\sqrt{n})\)
空间复杂度:\(O(n)\)
代码如下:
#include <set>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1e4+5,maxv=1e6+5;;
char s[5];
int n,m,block;
set<int>pos[maxv];
set<int>::iterator it;
int L[105],R[105],f[105][105];
int col[maxn],bel[maxn],pre[maxv],now[maxv];
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
void build(int id) {
for(int i=L[id];i<=R[id];i++)
f[id][i-L[id]+1]=pre[i];
sort(f[id]+1,f[id]+R[id]-L[id]+2);
}
int main() {
n=read(),m=read(),block=sqrt(n);
for(int i=1;i<=n;i++) {
col[i]=read(),bel[i]=(i-1)/block+1;
if(pos[col[i]].empty())
pos[col[i]].insert(0),pos[col[i]].insert(n+1);
if(bel[i]!=bel[i-1])R[bel[i-1]]=i-1,L[bel[i]]=i;
pre[i]=now[col[i]],now[col[i]]=i,pos[col[i]].insert(i);
}R[bel[n]]=n;
for(int i=1;i<=bel[n];i++)build(i);
while(m--) {
scanf("%s",s+1);
if(s[1]=='Q') {
int ans=0,l=read(),r=read();
if(bel[l]==bel[r]) {
for(int i=l;i<=r;i++)if(pre[i]<l)ans++;
}
else {
for(int i=l;i<=R[bel[l]];i++)if(pre[i]<l)ans++;
for(int i=L[bel[r]];i<=r;i++)if(pre[i]<l)ans++;
for(int i=bel[l]+1;i<bel[r];i++)
ans+=lower_bound(f[i]+1,f[i]+R[i]-L[i]+2,l)-f[i]-1;
}
printf("%d\n",ans);
}
else {
int p=read(),c=read(),tmp=col[p],l,r;
if(pos[c].empty())pos[c].insert(0),pos[c].insert(n+1);
pos[tmp].erase(pos[tmp].find(p));
it=pos[tmp].lower_bound(p);
if(it!=pos[tmp].end()&&it!=pos[tmp].begin())
r=*it,it--,l=*it,pre[r]=l,build(bel[r]);
it=pos[c].lower_bound(p);
if(it!=pos[c].end())pre[*it]=p,build(bel[*it]);
if(it!=pos[c].begin())it--,pre[p]=*it,build(bel[p]);
pos[c].insert(p);
col[p]=c;
}
}
return 0;
}
BZOJ2120:数颜色(分块版)的更多相关文章
- bzoj2120 数颜色 分块
分块大法好 orz 处理出每个点的前驱和后继位置. 暴力修改,查询就在每个整块里查询pre<l的,暴力跑两边就好了 #include<cstdio> #include<cstr ...
- Luogu 1903 数颜色 | 分块
Luogu 1903 数颜色 | 分块 莫队不会啊-- 这道题直接分块也能卡过! 这道题的做法很有趣:对于每个位置i,记录它的颜色a[i]上一次出现的位置,记为pre[i]. 这样在查询一个区间[l, ...
- BZOJ2120 数颜色 【带修莫队】
BZOJ2120 数颜色 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到 ...
- 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 653 Solved: 283[Submit][Status][Discuss] ...
- BZOJ 2120: 数颜色 分块
2120: 数颜色 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php? ...
- bzoj2120 数颜色 莫队 带修改
[bzoj2120]数颜色 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔 ...
- BZOJ2120 数颜色(树套树)
B. 数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令:1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色 ...
- 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]数颜色 (非正解 )(莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6286 Solved: 2489[Submit][Status][Discuss] ...
随机推荐
- 【转载】linux获取mac地址
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/soc ...
- Swift中的? ! as as? as!
?: 代表这是个可选类型(optional)的.如下,如果num有就为Int类型的,如果没有值那么就是nil. let num:Int? 当我对number进行显示赋值时那么number就是Int类型 ...
- C语言串口
可以用open和fopen来打开文件,open偏底层,fopen来自于open更顶层.(根据公司某个项目看了源码用的open) #include <stdio.h>#include < ...
- nginx面试要点
首先列出一些面试题目包括nginx和redis的. 1..nginx 框架是怎样的 2. nginx负载均衡的算法怎么实现的,懵逼,说没看过 . nginx 的 upstream目前支持 4 种方式 ...
- Elasticsearch6.0简介入门介绍
Elasticsearch简单介绍 Elasticsearch (ES)是一个基于Lucene构建的开源.分布式.RESTful 接口全文搜索引擎.Elasticsearch 还是一个分布式文档数据库 ...
- python机器学习——分词
使用jieba库进行分词 安装jieba就不说了,自行百度! import jieba 将标题分词,并转为list seg_list = list(jieba.cut(result.get(" ...
- 关于hadoop setCombinerClass 与 setReducerClass同时使用存在的问题。
最近在学习hadoop mapreduce编程的过程中遇到一个莫名奇妙的问题.最后通过调试时发现同时使用setCombinerClass(Reducer.class) 与 setReducerCl ...
- PhpSpreadsheet如何读取excel文件
PhpSpreadsheet如何读取excel文件 一.总结 一句话总结:万能的百度,直接搜代码就好,绝对有,毕竟github上面4000+的关注,说明很多人用了这个,使用照着demo倒是异常简单 二 ...
- R语言:导入导出数据
主要学习如何把几种常用的数据格式导入到R中进行处理,并简单介绍如何把R中的数据保存为R数据格式和csv文件. 1.保存和加载R的数据(与R.data的交互:save()函数和load()函数) a & ...
- spring boot: @EnableScheduling开启计划任务支持,@Scheduled计划任务声明
spring boot: @EnableScheduling开启计划任务支持, @Scheduled计划任务声明 package ch2.scheduler2; //日期转换方式 import jav ...