25/1/18 模拟赛做题记录

news/2025/1/19 14:49:20/文章来源:https://www.cnblogs.com/CodingGoat/p/18679566

B

题意

给定一个序列 \(a_{1\cdots n}\),你需要回答 \(m\) 个询问,每个询问给定 \(l,r\),你需要回答满足 \(l\leq i< j\leq r,a_i=a_j\) 的最小的 \(j-i\),即区间内最近的两个相同数的距离,若不存在,输出 -1

我们设 \(b_i\) 表示与位置 \(i\) 的元素权值相等且在 \(i\) 之后的最小位置。

因为答案要求 \([l,r]\) 之间的最小距离,所以相当于求 \(\min_{l\le i\le r}\{b_i|(i+b_i\le r)\}\)。我们发现 \((i+b_i\le r)\) 并不好控制,而 \(l\le i\le r\) 却是很简单的,所以不妨离线询问,并将其按照右端点排序。之后遍历他们的所有询问,每一次询问前先将 \(i+b_i\le r\) 的所有数加入线段树的位置 \(i\),每一次求 \([l,r]\) 的最小值。

时间复杂度 \(O(n \log n)\)

点击查看代码
#include<bits/stdc++.h>#define int ll
#define ll long long
#define i128 __int128#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")using namespace std;int read() {int x=0,f=1; char c=getchar();for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }#define maxn 1000050int n,m;
int a[maxn];
map<int,int> mp;struct node{int idx,l,r;bool operator<(const node&x) const {return r<x.r;}
}b[maxn],qu[maxn];struct SegT {int tr[maxn<<2];void pre() {For(i,0,(maxn<<2)-1) tr[i]=1e18; }void pu(int idx) {tr[idx]=min(tr[lc(idx)],tr[rc(idx)]);}void add(int idx,int l,int r,int k,int val) {if(l==r) return tr[idx]=val,void();int mid=l+r>>1;if(k<=mid) add(lc(idx),l,mid,k,val);else add(rc(idx),mid+1,r,k,val);pu(idx);}int query(int idx,int l,int r,int L,int R) {int res=1e18;if(L<=l&&r<=R) return tr[idx];int mid=l+r>>1;if(L<=mid) res=min(res,query(lc(idx),l,mid,L,R));if(R>mid) res=min(res,query(rc(idx),mid+1,r,L,R));return res;}
}Tr;int ans[maxn];void work() {in2(n,m);For(i,1,n) {in1(a[i]);if(mp[a[i]]) {b[mp[a[i]]]={mp[a[i]],mp[a[i]],i};}mp[a[i]]=i;}For(i,1,n) if(!b[i].idx) {b[i].idx=i,b[i].r=1e18;}For(i,1,m) {in2(qu[i].l,qu[i].r);qu[i].idx=i;}sort(qu+1,qu+m+1);sort(b+1,b+n+1);int idx=0;Tr.pre();For(i,1,m) {while(idx+1<=n&&b[idx+1].r<=qu[i].r) {idx++; Tr.add(1,1,n,b[idx].idx,b[idx].r-b[idx].l);}ans[qu[i].idx]=Tr.query(1,1,n,qu[i].l,qu[i].r);if(ans[qu[i].idx]>=1e18) ans[qu[i].idx]=-1;}For(i,1,m) cout<<ans[i]<<'\n';
}signed main() {
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);int _=1;
//	_=read();
//	cin>>_;For(i,1,_) {work();}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊一聊 操作系统蓝屏 c0000102 的故障分析

一:背景 1. 讲故事 今年以来不知道为啥总有些朋友加我微信,让我帮忙分析下操作系统蓝屏问题,我也觉得挺好奇的,就问了其中一位朋友,说是B站来的,我就在拼命回忆,为啥会找我分析蓝屏?突然想到了去年好像录了一集关于 CrowdStrike 的热点事件。。。我本来是做.NET程序的故…

4-01-(C++类 this指针)

结构体传参,传递的是副本 结构体里面写函数,结构体的大小不变 函数的地址不在结构体里面。 类里面的函数都要传一个this指针,即 lea ecx,[s] 普通的函数结构体传参 this指针的特点 1、你用或者不用,它就在那里 2、参数个数确定的时候,用ecx来传递 3、参数个数不确…

协议通道版iMessage蓝号检测,iMessages数据筛选,无痕检测是否开启iMessage服务

一、实现iMessage数据检测的两种方式:1.人工筛选,将要验证的号码输出到文件中,以逗号分隔。再将文件中的号码粘贴到iMessage客户端的地址栏,iMessage客户端会自动逐个检验该号码是否为iMessage账号,检验速度视网速而定。红色表示不是iMessage账号,蓝色表示iMessage账号。2…

【开源】一款功能全面的商用级溯源防伪系统,适用于各种溯源场景

项目介绍 HiPi是一款开源、功能全面的商用级溯源防伪系统,一物一码系统,适用于各种溯源场景的大、中、小、微规模企业。系统能够追踪记录产品的生命周期各个环节,并将产品信息保存在系统中,实现品牌保护、产品营销、防止假冒伪劣产品、防窜货、产品追踪溯源等功能。 应用场…

行为分析智能监测摄像机

行为分析智能监测摄像机具有高效的行为识别和分类能力。通过摄像头捕捉到目标区域内的行为活动,并通过预先训练好的机器学习算法进行识别和分类,可以准确地分析出不同的行为特征,例如跌倒、打架等,并及时发出警报或提醒相关管理人员。这种高效的行为识别能力可以帮助监控中…

秸秆焚烧自动监测摄像机

秸秆焚烧自动监测摄像机具有高效的监测和识别能力。通过摄像头捕捉到秸秆焚烧的情况,并通过预先训练好的机器学习算法进行识别和分类,可以准确地分析出不同的烟雾、火焰等特征,并及时发出警报或提醒相关管理人员。这种高效的监测和识别能力可以帮助监测中心快速反应异常情况…

ServletContext 的 4 个常见应用!

一、ServletContext类详解 Web容器在启动时,会为每一个Web项目创建一个对应的ServletContext对象。它是当前项目中所有Servlet实例之间信息交互的“中间商”。(参见“Servlet的运行原理”) 注:一个Web项目对应一个ServletContext。(即:同一个Web项目中的所有servlet实例共…

Servlet 映射(访问)路径的 3 种方式!

Servlet的映射(访问)路径是在Web配置文件(web.xml)中编写的。如: <!-- Servlet的访问路径 --> <servlet-mapping><servlet-name>servlet1</servlet-name><url-pattern>/hello</url-pattern> </servlet-mapping>1、servlet映射…

Java初学者笔记-05、集合框架

集合体系 集合是可变长的。 Collection:代表单列集合,每个元素包含一个值。 Map:代表双列集合,每个元素包含两个值。 Collection集合List系列集合:添加的元素是有序、可重复、有索引。ArrayList、 LinekdList:有序、可重复、有索引。Set系列集合:添加的元素是无序、不重…

.NET周刊【1月第1期 2025-01-05】

国内文章 3款.NET开源、功能强大的通讯调试工具,效率提升利器! https://www.cnblogs.com/Can-daydayup/p/18631410 本文介绍了三款功能强大的.NET开源通讯调试工具,旨在提高调试效率。这些工具包括LLCOM,提供串口调试和自动化处理功能;Wu.CommTool,支持Modbus RTU和MQTT调…

Servlet 详解!

一、Servlet简介 Servlet是Sun公司开发动态Web的一门技术。Sun公司在这些API中提供了一个Servlet接口,如果你想开发一个Servlet程序只需要完成如下两个步骤: 1、编写一个Java类实现Servlet接口。 2、把开发好的Java类部署到Web服务器中。 我们把实现了Servlet接口的Java程序叫…