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, ...
随机推荐
- 计算机网络概述---OSI参考模型
应用层:所有能产生网络流量的程序,例如:qq等,txt记事本没有产生流量,所以不属于应用层: 表示层:在传输之前对应用层的数据进行加工或处理,例如:加密.压缩.传视频时二进制,传文档时ASCII码 等 ...
- 8位单片机可用的 mktime localtime函数
8位单片机可用的 mktime localtime函数及源码 最近在做一个8位单片机项目,其中用到了时间戳转换函数,这个在32位机上一个库函数就解决了问题,没想到在8位单片机中没有对应库(time. ...
- c++ boost库学习二:内存管理->智能指针
写过C++的人都知道申请和释放内存组合new/delete,但同时很多人也会在写程序的时候忘记释放内存导致内存泄漏.如下所示: int _tmain(int argc, _TCHAR* argv[]) ...
- POJ 3253 Fence Repair 贪心+优先队列
题意:农夫要将板割成n块,长度分别为L1,L2,...Ln.每次切断木板的花费为这块板的长度,问最小花费.21 分为 5 8 8三部分. 思路:思考将n部分进行n-1次两两合成最终合成L长度和题目 ...
- Linux系统LVM分区减容扩容
Linux系统LVM分区减容扩容 目标:将VolGroup-lv_home缩小到20G,并将剩余的空间添加给VolGroup-lv_root 1.首先查看磁盘使用情况 [root@localhost ...
- 用js将一个数组合并到另一个数组中
var arr1 = ["one","two","three"]; var arr2 = ["1","2&qu ...
- ANT+JMETER集成3 (添加邮件附件)
在build.xml文件<email>中加入下面几行代码 <fileset dir="C:\apache-jmeter-3.0\html/"> <in ...
- VC++异常捕获??
1. std: #include <string> #include<iostream> // for cerr //#include <stdexcept> // ...
- AODH: ALARM EVENTS IN OPENSTACK
AODH是从Ceilometer分离出来的一个子项目,开始于OpenStack Liberty,用来提供alarm机制. 除了之前Ceilometer有的基于sample的警报机制,AODH还添加了基 ...
- JavaScript 对时间日期格式化
JavaScript 对时间日期格式化 // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s).季度(q) 可以用 1-2 个占位 ...