BZOJ2120:数颜色(莫队版)
浅谈莫队:https://www.cnblogs.com/AKMer/p/10374756.html
题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=2120
分块做法:https://www.cnblogs.com/AKMer/p/10373457.html
树套树做法:https://www.cnblogs.com/AKMer/p/10189008.html
裸的带修改莫队,用一个桶维护区间内元素,每次桶从\(0\)变\(1\)或者从\(1\)变\(0\)就把全局\(ans\)加一或减一即可。
时间复杂度:\(O(n^{\frac{5}{3}})\)
空间复杂度:\(O(n)\)
代码如下:
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1e4+5,maxv=1e6+5;
char s[5];
int n,m,block,ans,cnt1,cnt2,nowl,nowr,t;
int a[maxn],bel[maxn],cnt[maxv],lst[maxn];
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;
}
struct query {
int l,r,tim,id,res;
query() {}
query(int _l,int _r,int _tim,int _id) {
l=_l,r=_r,tim=_tim,id=_id;
}
bool operator<(const query &a)const {
if(bel[l]==bel[a.l]&&bel[r]==bel[a.r])return tim<a.tim;
if(bel[l]==bel[a.l])return bel[l]&1?bel[r]<bel[a.r]:bel[r]>bel[a.r];
return bel[l]<bel[a.l];
}
}q[maxn];
struct modify {
int pos,col,lst;
modify() {}
modify(int _pos,int _col,int _lst) {
pos=_pos,col=_col,lst=_lst;
}
}c[maxn];
bool cmp(query a,query b) {
return a.id<b.id;
}
void change(int pos,int col) {
if(pos>=nowl&&pos<=nowr) {
if(!cnt[col])ans++;
if(cnt[a[pos]]==1)ans--;
cnt[a[pos]]--,cnt[col]++;
}a[pos]=col;
}
void update(int col,int v) {
if(cnt[col]==1&&v==-1)ans--;
if(cnt[col]==0&&v==1)ans++;
cnt[col]+=v;
}
int main() {
n=read(),m=read(),block=pow(n,2.0/3);
for(int i=1;i<=n;i++)
lst[i]=a[i]=read(),bel[i]=(i-1)/block+1;
for(int i=1;i<=m;i++) {
scanf("%s",s+1);
if(s[1]=='Q') {
int l=read(),r=read();
q[++cnt1]=query(l,r,cnt2,i);
}
else {
int pos=read(),col=read();
c[++cnt2]=modify(pos,col,lst[pos]);
lst[pos]=col;
}
}
sort(q+1,q+cnt1+1);
nowl=1,nowr=0,t=0;
for(int i=1;i<=cnt1;i++) {
while(t<q[i].tim)t++,change(c[t].pos,c[t].col);
while(t>q[i].tim)change(c[t].pos,c[t].lst),t--;
while(nowl<q[i].l)update(a[nowl++],-1);
while(nowl>q[i].l)update(a[--nowl],1);
while(nowr<q[i].r)update(a[++nowr],1);
while(nowr>q[i].r)update(a[nowr--],-1);
q[i].res=ans;
}
sort(q+1,q+cnt1+1,cmp);
for(int i=1;i<=cnt1;i++)
printf("%d\n",q[i].res);
return 0;
}
BZOJ2120:数颜色(莫队版)的更多相关文章
- bzoj2120 数颜色 莫队 带修改
[bzoj2120]数颜色 Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔 ...
- bzoj2120: 数颜色 [莫队][分块]
Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜 ...
- BZOJ2120 数颜色 莫队 带修莫队
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ2120.html 题目传送门 - BZOJ2120 题意 给定一个长度为 $n$ 的序列 $a$ ,有 ...
- [BZOJ2120]数颜色(莫队算法)
Description 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜 ...
- 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]数颜色 (非正解 )(莫队)
2120: 数颜色 Time Limit: 6 Sec Memory Limit: 259 MBSubmit: 6286 Solved: 2489[Submit][Status][Discuss] ...
- BZOJ2120 数颜色(带修改莫队)
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- BZOJ2120数颜色(带修改莫队)
莫队算法是一种数据结构的根号复杂度替代品,主要应用在询问[l,r]到询问[l+1,r]和[l,r+1]这两个插入和删除操作复杂度都较低的情况下.具体思想是:如果把一个询问[l,r]看做平面上的点(l, ...
随机推荐
- Qt5.3.0的安装与测试
Qt5.3.0的安装与测试(交叉编译,用于arm,支持tslib触摸屏) 本次移植可以使用触摸屏. 首先下载源码包: http://download.qt.io/official_releases/q ...
- weblogic启动错误 Unrecognized option: -jrockit
高版本jdk启动低版本weblogic有时会报Unrecognized option: -jrockit参数错误 这纯粹是版本问题,版本更新更换参数名称的缘故 解决方法: “%WL_HOME%\com ...
- VMware VIC
vSphere Integrated Containers - a short intro High-Level view of VCH Networking vSphere Integrated C ...
- Ubuntu或Linux搭建网站环境常见问题详解
本屌丝常见的问题已经全部记录如下,如大家有其他问题欢迎随时跟我进行交流. 1.无法进行软件源安装 提示信息:Package has no installation candidate 具体信息如下: ...
- winform获取文件路径
1.取得控制台应用程序的根目录方法 方法1.Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径 方法2.AppDomain.CurrentD ...
- 简单的文件上传的下载(动态web项目)
1.在页面中定义一个form表单,如下: <!-- 文件上传 --> <form action="${pageContext.request.contextPath}/Fi ...
- R语言笔记002——sample()函数
sample()函数 sample(x,size,replace=FALSE) x表示一个或多个向量,size表示从x中随机取的样本个数,replace=FALSE表示不放回抽样,即不会选取到相同的值 ...
- psd文件中截取固定大小的图片
1.选择需要操作的图层 使用选框工具, 设置固定大小和固定大小的值,在图层上拉取选区 2.使用移动工具 使用垂直.水平居中 使选择的icon在选区块中间 3.再选择好块区域调整好位置后 使用截取工具 ...
- Spring初学之注解方式配置bean
直接看代码: UserController.java package spring.beans.annotation.controller; import org.springframework.be ...
- BZOJ 2111 [ZJOI2010]Perm 排列计数:Tree dp + Lucas定理
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意: 给定n,p,问你有多少个1到n的排列P,对于任意整数i∈[2,n]满足P[i ...