Link

题目大意:单点修改,每次询问一个区间的所有颜色出现次数的\(\text{Mex}.\)

例如,区间中三种颜色分别出现了\(2,2,3\)次,又因为其他颜色出现次数一定是\(0\),所以这里的答案是\(1.\)

\(\text{Solution:}\)

这是带修莫队的一道题。

观察到,我们可以\(O(1)\)来更新一个颜色的出现次数,以及这个出现次数的次数。

套上带修莫队套路,每次按照三关键字排序,左,右,时间。时间是修改相关。每次我们更改一个颜色,就把原来的颜色删掉一个,新改的颜色加上一个就好了。

因为当块长为\(n^{\frac{2}{3}}.\)时,时间复杂度为\(n^{\frac{5}{3}}\).所以可以过。

下面是一些处理技巧:

对于颜色很大,观察到\(n,q\)不大,所以有用的颜色最多有\(n+q\)个,直接离散化即可。复杂度\(O(n\log n).\)

那么,每次答案怎么统计呢?

考虑暴力的方法。因为\(0\)一定不会是答案,所以我们从\(1\)开始枚举。考虑最长的枚举次数,设为\(x\).

那么有\(\frac{x*(x+1)}{2}\leq n\),就是出现次数从\(1\)加到\(x\).

那么:

\(x^2+x \leq 2n\),也就是说\(x\)也就\(\sqrt{n}\)的级别左右。

如果\(q\)次统计,那复杂度就是\(O(q\sqrt n).\)由于\(n,q\)同阶,而这个复杂度就是\(O(n^{\frac{3}{2}})\),小于\(O(n^{\frac{5}{3}}).\)所以复杂度有保证。

\(1e5\)的情况下这个复杂度还是可以的。在\(\text{O2}\)情况下跑的很优秀。一般的话这个复杂度算出来是\(O(10^{\frac{25}{3}})=O(10^{8.3333})\),卡时间限制可以过。

代码:

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
int bl[MAXN],a[MAXN],n,m,siz,bnum;
int ans[MAXN],cnt[MAXN],mex[MAXN];
int cntq,cntc,A[MAXN],tot,L;
inline bool isdigit(char C){return C<='9'&&C>='0';}
struct Q{
int l,r,t,id;
bool operator<(const Q&B)const{
return (bl[l]^bl[B.l])?bl[l]<bl[B.l]:(bl[r]^bl[B.r])?bl[r]<bl[B.r]:bl[t]<bl[B.t];
}
}q[MAXN];
struct C{
int pos,v;
}c[MAXN];
inline int read(){
register int s=0;
register char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
return s;
}
inline void write(int x){
if(x<0)putchar('-'),x=-x;
if(x>=10)write(x/10);
putchar(x%10+48);
}
void del(int x){
--mex[cnt[a[x]]];
++mex[--cnt[a[x]]];
}
void add(int x){
--mex[cnt[a[x]]];
++mex[++cnt[a[x]]];
}
int Get(){
int i;for(i=1;mex[i];++i);
return i;
}
int main(){
scanf("%d%d",&n,&m);
for(register int i=1;i<=n;++i)A[++tot]=read(),a[i]=A[tot];
siz=pow(n,(double)2.0/3.0);
bnum=ceil((double)n/siz);
for(register int i=1;i<=bnum;++i)for(register int j=(i-1)*siz+1;j<=i*siz;++j)bl[j]=i;
for(register int i=1;i<=m;++i){
register int opt=read();
if(opt==1){
q[++cntq].t=cntc;
q[cntq].id=cntq;
q[cntq].l=read();
q[cntq].r=read();
}
else{
c[++cntc].pos=read();
c[cntc].v=read();
A[++tot]=c[cntc].v;
}
}
sort(q+1,q+cntq+1);
sort(A+1,A+tot+1);
L=unique(A+1,A+tot+1)-A-1;
for(register int i=1;i<=n;++i)a[i]=lower_bound(A+1,A+L+1,a[i])-A;
for(register int i=1;i<=cntc;++i)c[i].v=lower_bound(A+1,A+L+1,c[i].v)-A;
int l=1,r=0,tm=0;
for(register int i=1;i<=m;++i){
int ql=q[i].l,qr=q[i].r,qt=q[i].t;
while(l<ql)del(l++);
while(l>ql)add(--l);
while(r<qr)add(++r);
while(r>qr)del(r--);
while(tm<qt){
++tm;
if(c[tm].pos>=ql&&c[tm].pos<=qr){
del(c[tm].pos);
swap(a[c[tm].pos],c[tm].v);
add(c[tm].pos);
}
if(!(c[tm].pos>=ql&&c[tm].pos<=qr))swap(a[c[tm].pos],c[tm].v);
}
while(tm>qt){
if(c[tm].pos>=ql&&c[tm].pos<=qr){
del(c[tm].pos);
swap(a[c[tm].pos],c[tm].v);
add(c[tm].pos);
}
if(!(c[tm].pos>=ql&&c[tm].pos<=qr))swap(a[c[tm].pos],c[tm].v);
--tm;
}
ans[q[i].id]=Get();
}
for(register int i=1;i<=cntq;++i)write(ans[i]),puts("");
return 0;
}

【题解】CF940F Machine Learning的更多相关文章

  1. [CF940F]Machine Learning

    codeforces 一句话题意 求区间数字出现次数的mex,带修改 sol 带修膜队不解释 带修膜队的排序! struct query{ int id,l,r,t; bool operator &l ...

  2. CF940F Machine Learning 带修改莫队

    题意:支持两种操作:$1.$ 查询 $[l,r]$ 每个数字出现次数的 $mex$,$2.$ 单点修改某一位置的值. 这里复习一下带修改莫队. 普通的莫队中,以左端点所在块编号为第一关键字,右端点大小 ...

  3. CF940F Machine Learning(带修莫队)

    首先显然应该把数组离散化,然后发现是个带修莫队裸题,但是求mex比较讨厌,怎么办?其实可以这样求:记录每个数出现的次数,以及出现次数的出现次数.至于求mex,直接暴力扫最小的出现次数的出现次数为0的正 ...

  4. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  5. 【Machine Learning】Python开发工具:Anaconda+Sublime

    Python开发工具:Anaconda+Sublime 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现 ...

  6. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  7. 【Machine Learning】决策树案例:基于python的商品购买能力预测系统

    决策树在商品购买能力预测案例中的算法实现 作者:白宁超 2016年12月24日22:05:42 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本 ...

  8. 【机器学习Machine Learning】资料大全

    昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...

  9. [Machine Learning] Active Learning

    1. 写在前面 在机器学习(Machine learning)领域,监督学习(Supervised learning).非监督学习(Unsupervised learning)以及半监督学习(Semi ...

随机推荐

  1. CET-4 Word 计划表

    a {text-decoration: none} CET-4 计划表 Sun Mon Tue Wed Thu Fri Sat 9/1 List-1 9/2 List-2 *List-1 9/3 Li ...

  2. checkbox手动样式改变

    .image_input_checkbox{ width:18px; height:18px; display: inline-block; vertical-align: middle; -webk ...

  3. wxmini

    微信小游戏架构概览 https://www.jianshu.com/p/02199c35d749 微信小程序:工具配置 project.config.json https://www.cnblogs. ...

  4. 关于ASP.NET MVC的权限认证的一些总结

    最近在学ASP.NET MVC的权限认证的一些东西,上网搜索了一阵,发现网上的方法大多数是以下几类: 一.FormsAuthentication.SetAuthCookie(admin.Name, f ...

  5. 02_套接字编程(socket抽象层)

    1.套接字概述 1.套接概述: 套接是进行网络通信的一种手段(socket) 2.套接字分类:         流式套接字(SOCK_STREAM): 传输层基于tcp协议进行通信         数 ...

  6. 单线程模式从网易下载A股叁仟捌佰支股票一年的交易数据耗时十四分钟

    代码下载:https://files.cnblogs.com/files/xiandedanteng/StockDataDownloader20200305.rar 压缩包内包含股票代号文件,调整好日 ...

  7. 如何PJ IDEA

    1.打开:http://idea.medeming.com/jets/,点击下载PJ码 2.下载完成后解压,会得到2个文件 3.启动IDEA时,将PJ码复制到: 点击ok,就可进入idea中.接着PJ ...

  8. Spring IoC 到底是什么

    前言 「上一篇文章」我们对 Spring 有了初步的认识,而 Spring 全家桶中几乎所有组件都是依赖于 IoC 的. 刚开始听到 IoC,会觉得特别高大上,但其实掰开了很简单. 跟着我的脚步,一文 ...

  9. Georgia and Bob(POJ 1704)

    原题如下: Georgia and Bob Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12712   Accepted: ...

  10. 大写的服,看完这篇你还不懂RocketMQ算我输

    目录 RocketMQ介绍 RocketMQ概念 为什么要用RocketMQ? 异步解耦 削峰填谷 分布式事务最终一致性 数据分发 RocketMQ架构 RocketMQ消息类型 普通消息 顺序消息 ...