题意:给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 }
Unique Encryption Keys (思维题 预处理),码迷,mamicode.com
时间: 2024-08-05 11:14:50