版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37360631/article/details/82051684
题意:告诉你1-n的区间,每个数对应一个整数,然后有一堆查询的操作,问查询的区间是否有重复的整数。
分析:
很好的一道题目,错了很久。
建立一个f数组,记录从当前位置向后匹配的最小区间。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#define maxn 3000010
using namespace std;
int m,n,q;
int a[maxn],f[maxn]; //f记录从当前位置向后匹配的最小区间
int main(){
std::ios::sync_with_stdio(false);
while(cin>>m>>q){
if(m==0&&q==0) break;
for(int i=1;i<=m;i++) cin>>a[i];
memset(f,0,sizeof(f));
map<int,int> mp;
f[m]=m+1;
mp[a[m]]=m;
for(int i=m-1;i>=1;i--){
if(mp[a[i]]==0) f[i]=f[i+1];
else f[i]=min(mp[a[i]],f[i+1]);
mp[a[i]]=i;
}
int l,r;
while(q--){
cin>>l>>r;
if(f[l]>r) cout<<"OK"<<endl;
else cout<<a[f[l]]<<endl;
}
cout<<endl;
}
return 0;
}