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] ...
随机推荐
- OpenCV图片拼接的两种方法
https://my.oschina.net/xiaot99/blog/226589 一.原图 1.jpg 2.jpg ...
- Struts2笔记01——基础MVC架构(转)
原始内容:https://www.tutorialspoint.com/struts_2/basic_mvc_architecture.htm Apache Struts 2是用来创建企业级Java ...
- nodejs/REPL环境命令行操作命令
1,输入node 进入node[REPL]环境 2,按两次[ctrl+c]退出node[REPL]环境 3,上箭头会查找上次输入的命令 4,cls清屏 5,tab键会自动补全路径 6,REPL环境
- iOS_SDWebImage框架分析
SDWebImage 支持异步的图片下载+缓存,提供了 UIImageView+WebCacha 的 category,方便使用.使用SDWebImage首先了解它加载图片的流程. 入口 setIma ...
- Pandas标记删除重复记录
Pandas提供了duplicated.Index.duplicated.drop_duplicates函数来标记及删除重复记录 duplicated函数用于标记Series中的值.DataFrame ...
- Go 内置库 IO interface
基本的 IO 接口 io 包为 I/O 原语提供了基本的接口.它主要包装了这些原语的已有实现. 由于这些接口和原语以不同的实现包装了低级操作,因此除非另行通知,否则客户端不应假定它们对于并行执行是安全 ...
- K8s API
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.10/#daemonset-v1-apps http://docs.k ...
- org.apache.flume.ChannelException: Take list for MemoryTransaction, capacity 100 full, consider committing more frequently, increasing capacity, or increasing thread count
flume在抽取MySQL数据到kafka时报错,如下 [SinkRunner-PollingRunner-DefaultSinkProcessor] ERROR org.apache.flume.s ...
- lua闭包浅析及项目应用
lua函数与闭包: 原文地址:http://www.doc88.com/p-6681238341344.html 近日查阅关于lua的一些资料,找到了我能理解的关于lua函数与闭包的解析,我觉得这个程 ...
- HTML5 新元素之VIDEO标签的js操作
本文参考w3school的HTML DOM Video 对象. Video 对象属性 属性 描述 audioTracks 返回表示可用音频轨道的 AudioTrackList 对象. autoplay ...