【题解】CF940F Machine Learning
题目大意:单点修改,每次询问一个区间的所有颜色出现次数的\(\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的更多相关文章
- [CF940F]Machine Learning
codeforces 一句话题意 求区间数字出现次数的mex,带修改 sol 带修膜队不解释 带修膜队的排序! struct query{ int id,l,r,t; bool operator &l ...
- CF940F Machine Learning 带修改莫队
题意:支持两种操作:$1.$ 查询 $[l,r]$ 每个数字出现次数的 $mex$,$2.$ 单点修改某一位置的值. 这里复习一下带修改莫队. 普通的莫队中,以左端点所在块编号为第一关键字,右端点大小 ...
- CF940F Machine Learning(带修莫队)
首先显然应该把数组离散化,然后发现是个带修莫队裸题,但是求mex比较讨厌,怎么办?其实可以这样求:记录每个数出现的次数,以及出现次数的出现次数.至于求mex,直接暴力扫最小的出现次数的出现次数为0的正 ...
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- 【Machine Learning】Python开发工具:Anaconda+Sublime
Python开发工具:Anaconda+Sublime 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现 ...
- 【Machine Learning】机器学习及其基础概念简介
机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- 【Machine Learning】决策树案例:基于python的商品购买能力预测系统
决策树在商品购买能力预测案例中的算法实现 作者:白宁超 2016年12月24日22:05:42 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本 ...
- 【机器学习Machine Learning】资料大全
昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...
- [Machine Learning] Active Learning
1. 写在前面 在机器学习(Machine learning)领域,监督学习(Supervised learning).非监督学习(Unsupervised learning)以及半监督学习(Semi ...
随机推荐
- Sql 注入----学习笔记
先了解下CRLF,CRLF常用在分隔符之间,CR是carriage retum(ASCII 13,\r) LF是Line Feed (ASCII 10,\n), \r\n这两个字符类似于回车是用于换行 ...
- Java-学习日记(100 == 100为true,1000 == 1000却为false?)
Integer底层设计 100 == 100为true,1000 == 1000却为false? 之前也写过String的==与equals的注意点,这次写下Integer的底层设计,不妨先运行下下面 ...
- 在Notepad++下运行ruby代码
轻量级,轻量级,所以用notepad++来运行ruby的代码最合适不过了,虽说有更好用的轻量级工具,但是用notepad++习惯了,也懒得去再装其他工具了.好了,进入主题,先安装插件NppExec,打 ...
- vue中饼状图的使用
图形构建子组件 <template> <div> <div id="myChart" :style="echartStyle"&g ...
- Kubernetes 初体验(先占个坑)
- i春秋公益赛之signin
题目链接:https://buuoj.cn/challenges#gyctf_2020_signin 查看程序保护 只开了canary和NX保护,在IDA查看反编译出来的为代码时发现程序给了一个后门 ...
- pwnable.kr之passcode
使用ssh passcode@pwnable.kr -p2222登录到远程服务器, ls -l 查看目录下的文件, -r--r----- root passcode_pwn Jun flag -r-x ...
- Dockerfile使用,示例
1.dockerfile介绍 镜像分类: 基础镜像:例如centos.Ubuntu.alpine 环境镜像:例如Java.php.go 项目镜像:将项目与环境镜像打包一起 2.Dockerfile常用 ...
- 真正的解决IDEA中Tomcat控制台乱码的问题
真正的解决IDEA中Tomcat控制台乱码的问题 解决方案一 网上看到一个真正的解决方案: 首先要分清是tomcat日志编码,与idea的日志显示控制台编码 tomcat日志编码:当在cmd中启动To ...
- docker push出现denied: requested access to the resource is denied
今天想再 把本地的docker image 镜像push 到: https://hub.docker.com/ Step1: login : https://hub.docker.com/ [root ...