区间检测题解

news/2024/10/5 22:48:17

记录 \(pre_i\)\(a_i\) 上一次出现的位置。

每一次求 \([L,R]\) 范围内是否有相同的数即 \(pre_L\)\(pre_R\) 中的最大值是否小于 \(L\)

注意到 \(pre_1\)\(pre_{L-1}\) 中最大数一定小于 \(L\),所以求 \([L,R]\) 范围内是否有相同的数即\(pre_1\)\(pre_R\) 中的最大值是否小于 \(L\)

接下来考虑如何求 \(pre\),将原数组排序后相同的数就会靠在一起,也就可以求 \(pre\) 了。

给出85ms代码:

#include<bits/stdc++.h>
using namespace std;
const int M=500005;
int n,m,A[M],pre[M],B[M];
void rd(int &res){char c;res=0;while(c=getchar_unlocked(),c<48);do res=(res<<3)+(res<<1)+(c^48);while(c=getchar_unlocked(),c>=48);
}
int main(){rd(n);rd(m);for(int i=1;i<=n;i++) rd(A[i]),B[i]=i;sort(B+1,B+n+1,[&](int i,int j){return A[i]<A[j]||(A[i]==A[j]&&i<j);});for(int i=2;i<=n;i++)if(A[B[i]]==A[B[i-1]]) pre[B[i]]=B[i-1];for(int i=2;i<=n;i++) if(pre[i]<pre[i-1]) pre[i]=pre[i-1];int L,R;while(m--){rd(L);rd(R);putchar_unlocked((pre[R]<L)^48);putchar_unlocked('\n');} 
}

接下来考虑优化排序,因为每个32位整形都由2个16位二进制组成,所以可以类比基数排序写出更快的基数排序,先按低16位排序,再按高16位排序。

正解:

//std
#include<bits/stdc++.h>
using namespace std;
const int M=500005;
int n,m,A[M],pre[M],C[65536],B[M],D[M],P=65535;
inline void rd(int &res){char c;res=0;while(c=getchar_unlocked(),c<48);do res=(res<<3)+(res<<1)+(c^48);while(c=getchar_unlocked(),c>=48);
}
inline void Sort(){for(int i=1;i<=n;++i) C[A[i]&P]++;for(int i=1;i<=P;++i) C[i]+=C[i-1];for(int i=n;i>=1;--i) B[C[A[i]&P]--]=i;memset(C,0,sizeof C);for(int i=1;i<=n;++i) ++C[(A[B[i]]>>16)&P];for(int i=1;i<=P;++i) C[i]+=C[i-1];for(int i=n;i>=1;--i) D[C[(A[B[i]]>>16)&P]--]=B[i];for(int i=1;i<=n;++i) B[i]=D[i];
}
int main(){rd(n);rd(m);for(int i=1;i<=n;++i) rd(A[i]);Sort();for(int i=2;i<=n;++i)if(A[B[i]]==A[B[i-1]]) pre[B[i]]=B[i-1];for(int i=2;i<=n;++i) if(pre[i]<pre[i-1]) pre[i]=pre[i-1];int L,R;while(m--){rd(L);rd(R);putchar_unlocked((pre[R]<L)^48);putchar_unlocked('\n');} 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/60961.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Nuxt Kit 中的上下文处理

title: Nuxt Kit 中的上下文处理 date: 2024/9/16 updated: 2024/9/16 author: cmdragon excerpt: Nuxt Kit 提供的上下文处理工具,尤其是 useNuxt 和 tryUseNuxt,为模块化开发提供了极大的便利。通过这些函数,开发者可以方便地访问 Nuxt 实例,从而更好地管理应用配置。 …

佩戴安全帽 人员聚集识别

佩戴安全帽人员聚集识别借助现场已经安装的监控摄像机实时监控现场画面,识别职工是不是戴安全帽,是不是人员聚集状态,进而发送警示和提醒。佩戴安全帽人员聚集识别系统选用最新神经网络算法和边缘计算,可以代替人的双眼,全自动识别各种各样违规操作如:反光衣穿戴识别、安…

安全帽佩戴检测摄像头

安全帽佩戴检测摄像头借助现场已有的监控摄像头或者专门安装内置算法的监控摄像头,对现场人员安全帽佩戴进行实时识别检测。安全帽佩戴检测摄像头通过RTSP协议访问摄像机视频流,实时获取分析。立即识别视频监控区域未戴安全帽的工人,并实时分析抓拍警报。安全帽佩戴检测摄像…

反光衣穿戴识别系统介绍

反光衣穿戴识别系统依据深度学习+边缘计算视觉分析技术,利用已有的摄像头对现场作业人员穿戴实时分析和识别视频图像数据。不用人工干预,反光衣穿戴识别系统全天候24h不间断对作业现场实时监控,当检测出工人不穿反光衣时,及时抓拍提醒并把违规信息发送给系统后台,反光衣穿…

学校食堂视频监控分析系统

学校食堂视频监控分析系统利旧现场已有的监控摄像头,可以对学校后厨识别监控厨师是否佩戴厨师帽厨师服、有无戴口罩、违规抽烟、陌生人进到后厨以及后厨出现老鼠猫狗等,并及时抓拍预警、后台推送违规图像信息。学校食堂视频监控分析系统智能实时分析产生的违规抓拍、对接并自…

摄像机识别未戴安全帽

摄像机识别未戴安全帽系统利用边缘计算+机器学习与深度学习技术,摄像机识别未戴安全帽系统借助现场部署的监控摄像机RTSP协议访问摄像机视频流,实时获取,实时分析,实时报警,并且抓拍人像分析人员信息、识别是不是戴安全帽、同歩声音报警,将报警信息快照和报警视频存入数据…

秸秆焚烧监控系统

秸秆焚烧监控系统通过现场通信铁塔基站上架设高空高像素监控摄像头,进行周边地域360度全天候24小时不间断实时监控,秸秆焚烧监控系统通过RTSP协议访问摄像机视频流,实时获取抓拍现场视频流画面实时分析,并且自动识别秸秆焚烧行为现象,实时报警并且将违规画面传回监控后台。…

加油站智能监控系统改造解决方案

加油站智能监控系统改造解决方案针对加油区、卸油区工作人员睡岗、工作时间抽烟、打电话等违反规定行为、明火烟雾、扬尘等异常现象,加油站智能监控系统改造解决方案针对卸油区:灭火器材置放不合理,卸油时工作人员换岗,静电释放时长不够,开展智能分析识别。如系统发现上述…