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

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/qq_37360631/article/details/82051684