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. 【MarkDown】github readme添加图片 Markdown语法添加图片,适用各种markdown语法

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985, QQ986945193 微博:http://weibo.com/mcxiaobing 首先给大家看一 ...

  2. (Android图片内存优化)Picasso加载图片 教程。。详细版

    Picasso 是 Android 上一个强大的图片下载和缓存库. 示例代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Picasso.with( ...

  3. c++ binding code generator based on clang

    google it http://www.swig.org/Doc3.0/CSharp.html http://samanbarghi.com/blog/2016/12/06/generate-c-i ...

  4. spring集成shiro,事务失效问题 not eligible for auto-proxying

    BeanPostProcessor bean实例化顺序有关,@Configuration会最先实例化,也就是在spring启动完成之前. 导致Configuration中使用的注入,没能在spring ...

  5. 利用阿里云服务器免费体验word press博客、个人网站

    本文首发于我的个人博客:https://chens.life/create-wordpress-blog.html 前言 目前市面上有许许多多的虚拟云服务器ECS,例如阿里云.华为云.又拍云等等,他们 ...

  6. python简介以及简单代码——python学习笔记(一)

    学习来源:https://www.liaoxuefeng.com/wiki/1016959663602400 了解python 简单编写并实现python代码 命令行模式和python交互模式 了解p ...

  7. Oracle12C创建scott账户

    Oracle12C创建scott账户 具体步骤: 打开SqlPlus 输入用户名和密码用户名:sys口令:sys as sysdba 创建c##scott用户CREATE USER c##scott ...

  8. 给MySQL中数据表添加字段

    添加一个char字段: mysql> alter table stock add src char(20); Query OK, 3766 rows affected (0.65 sec) Re ...

  9. Oracle中树形查询使用方法

    树形查询一般用于上下级场合,使用的特殊sql语法包括level,prior,start with,connect by等,下面将就实例来说明其用法. 表定义: create table tb_hier ...

  10. 本机ping不通虚拟机,但虚拟机可以ping通本机

    在各自网络都连接的情况下,本机ping不通虚拟机,但虚拟机可以ping通本机时解决方案: 1.linux虚拟机中连接方式选择NAT模式 2.本地启动VMnet8,然后选择VMnet8的属性,手动输入和 ...