当前位置: 代码迷 >> 综合 >> CERC2011 I Unique Encryption Keys(向后最小区间匹配,思维)
  详细解决方案

CERC2011 I Unique Encryption Keys(向后最小区间匹配,思维)

热度:86   发布时间:2023-11-08 15:33:17.0

题意:告诉你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;
}
  相关解决方案