【题解】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 ...
随机推荐
- Xutils 的框架问题retry error, curr request is null Android开发之网络请问问题
没有网络权限也能导致这个问题 也可能是因为模拟机没联网的问题
- Codeforece E. Anton and Permutation
主席树算贡献l,r中交换位置,算出>=rank(h) 和 <=rank(h) a[l],a[r] 先不统计 a[l]比a[r]大的话交换后ans-1,a[l]比a[r]小的话交换后ans- ...
- 【MySQL】我这样分析MySQL中的事务,面试官对我刮目相看!!
写在前面 相信大部分小伙伴在面试过程中,只会针对面试官提出的表面问题来进行回答.其实不然,面试官问的每一个问题都是经过深思熟虑的,面试的时间相对来说也是短暂的,面试官不可能在很短的时间内就对你非常了解 ...
- webpack3.10.0(入门系列基本概念1)
一.概念 webpack的核心是一个用于现代JavaScript应用程序的静态模块打包程序.当webpack处理您的应用程序时,它会递归地构建一个依赖图,其中包含应用程序所需的每个模块,然后将所有这些 ...
- npm 进阶命令知多少(一)
npm命令知多少(一) 前言 作为前端模块化扎展现形式的npm包,已经在前端开发中不可或缺,熟练掌握npm相关内容,也是前端开发者的一门必修课,那么除了npm publish这类常见内容之外,还有哪些 ...
- .NET CORE命令行
目录 0. 基础命令行 1. 基础命令 2. SDK命令 3. 使用命令行创建. net Core项目 shanzm-2020年9月7日 22:00:00 0. 基础命令行 D:默认路径跳转到D盘 c ...
- 汽车芯片如何高效符合ISO 26262功能安全标准
汽车芯片和集成电路(IC)是高级驾驶员辅助系统(advanced driver assistance systems-ADAS)和联网自动驾驶汽车(connected autonomous veh ...
- 20190925-02配置redis服务在后台启动 000 023
多端口要加 -p 可以进入指定端口
- warning: #1295-D: Deprecated declaration LED_Init - give arg types警告的解决办法
- command三国杀开发日记20200914
目前状态 一时脑热开始写的东西,计划完全使用C语言实现,尽量使用通用接口,能够在windows上直接运行 几乎是一穷二白,初步搭建了牌堆.玩家信息接口体,编写了简单的UI函数,能够将玩家信息显示在屏幕 ...