首页 > 其他分享 >区间检测题解

区间检测题解

时间:2024-09-16 12:23:43浏览次数:1  
标签:pre res 16 int 题解 rd -- 检测 区间

记录 \(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');
	} 
}

标签:pre,res,16,int,题解,rd,--,检测,区间
From: https://www.cnblogs.com/cly312/p/18416172

相关文章

  • 题解:P9957 [USACO20DEC] Stuck in a Rut B
    由于\(x,y\leq10^9\),我们无法模拟每个时间段。因此,我们需要尝试判断两头牛何时会相交。一个重要的观察是,牛不能后退,所以两头牛发生碰撞的唯一方式是\(n[x]>e[x]\)且\(n[y]<e[y]\)。可以按牛的起始坐标进行排序,然后模拟这些碰撞。代码:#include<bits/stdc++.h>using......
  • 题解:P3113 [USACO14DEC] Marathon G
    用线段树维护子路径的长度和这条子路径上删除一个点能够减少的最大距离。那么,修改就修改线段树上对应位置的值,查询就求这一段子路径的距离和子路径上删除一个点能够减少的最大距离,两者相减即可得到答案。代码:#include<bits/stdc++.h>usingnamespacestd;typedefpair<int,in......
  • 安全帽佩戴检测摄像头
    安全帽佩戴检测摄像头借助现场已有的监控摄像头或者专门安装内置算法的监控摄像头,对现场人员安全帽佩戴进行实时识别检测。安全帽佩戴检测摄像头通过RTSP协议访问摄像机视频流,实时获取分析。立即识别视频监控区域未戴安全帽的工人,并实时分析抓拍警报。施工工地是一个存有安全隐......
  • 题解:P10961 划分大理石
    设\(f_x\)表示拼成\(x\)后,当前的大理石最多还能剩下几块,不能拼成就是\(-1\)。状态转移(当前考虑的大理石价值为\(i\),有\(x\)块):\(f_j=x(f_j\ge0)\)本来就可以拼成,那么现在的大理石都可以剩下。\(f_j=f_{j-i}-1(f_j=-1,j\gei,f_{j-i}>0)\)本来不能拼成,但用了一块就能拼......
  • 小麦病害检测数据集
    小麦病害检测数据集】nc=3标签names:['BacteriaLeafBlight','BrownSpot','Leafsmut']名称:【'细菌叶斑病','褐斑病','叶瘤病'】共6715张,8:1:1比例划分,(train;5372张,val:671张,test:672张标注文件为YOLO适用的txt格式。可以直接用于模型训练。小麦病害检测数据集】nc=3标......
  • 小麦病害检测数据集【‘细菌叶斑病‘, ‘褐斑病‘, ‘叶瘤病‘】
    小麦病害检测数据集】nc=3标签names:['BacteriaLeafBlight','BrownSpot','Leafsmut']名称:【'细菌叶斑病','褐斑病','叶瘤病'】共6715张,8:1:1比例划分,(train;5372张,val:671张,test:672张标注文件为YOLO适用的txt格式。可以直接用于模型训练。小麦病害检测数据集介绍项目......
  • 建筑裂缝检测图像ai模型训练数据集
    共52w例图像的建筑裂缝检测图像ai模型训练数据集20地上设施(公路桥梁、铁路桥梁、水坝(墙)、挡土墙)和地下SOC设施(公路/铁路隧道、地铁、水隧道);韩国40个市、县、区SOC设施的数据,并考虑多样性分布;10种裂纹/缺陷(裂纹、网状裂纹、分层、剥落、泛白、漏水、钢筋外露、材料分离......
  • 【目标检测数据集】卡车数据集1073张VOC+YOLO格式
    数据集格式:PascalVOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):1073标注数量(xml文件个数):1073标注数量(txt文件个数):1073标注类别数:1标注类别名称:["truck"]每个类别标注的框数:truck框......
  • 【目标检测数据集】锯子数据集1107张VOC+YOLO格式
    数据集格式:PascalVOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):1107标注数量(xml文件个数):1107标注数量(txt文件个数):1107标注类别数:1标注类别名称:["juzi"]每个类别标注的框数:juzi框数......
  • AGC026D Histogram Coloring 题解
    [AGC026D]HistogramColoring题解给定\(n\)列的网格,每列高为\(h_i\),将每个格子染色成红色或蓝色,使得每个\(2\times2\)的区域都恰好有两个蓝格子和两个红格子,求方案数(对\(10^9+7\)取模)。\(1\leqn\leq100,1\leqh_i\leq10^9\)性质为了方便讲述,先假设\(h_i=h_{i+......