Unique Encryption Keys (思维题 预处理)

题目

题意:给m个数字, q次询问, 询问b到e之间如果有重复数字就输出, 没有就输出OK

思路:用f[i]数组 记录从i开始向后最近的有重复数字的 位置, 如 1 3 2 2, 则f[1] = 4;

如果离a最近的重复数字的位置 都大于b, 就说明没有重复数字。

f[]数组需要预处理,从后向前。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <vector>
 5 #include <map>
 6 #define Min(a, b)((a)>(b)?(b):(a))
 7 using namespace std;
 8 const int maxn = 1000000+10;
 9 int a[maxn], f[maxn];
10 
11 int main()
12 {
13     int m, q, b, e, i;
14     while(~scanf("%d%d", &m, &q))
15     {
16         if(m==0&&q==0)
17         break;
18         for(i = 1; i <= m; i++)
19             scanf("%d", &a[i]);
20         memset(f, 0, sizeof(f));
21         map<int, int>mp;
22         f[m] = m+1;
23         mp[a[m]] = m;
24         for(i = m-1; i >=1; i--)
25         {
26             if(mp[a[i]]==0)
27                 f[i] = f[i+1];
28             else
29                 f[i] = Min(mp[a[i]], f[i+1]);
30             mp[a[i]] = i;
31         }
32         while(q--)
33         {
34             scanf("%d%d", &b, &e);
35             if(f[b]>e)
36                 cout<<"OK"<<endl;
37             else
38             cout<<a[f[b]]<<endl;
39         }
40     }
41     return 0;
42 }

 

转载于:https://www.cnblogs.com/bfshm/p/3702851.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值