DES:给出一个数列。然后有q个询问,对给定的区间内是否有重复的数。如果有输出任意一个重复的。如果没有输出OK。

开始以为是线段树。后来发现。只是水的比较隐蔽。感觉这个方法还是很聪明的。把每个点的最近的有重复的数的区间记录下来。这样每次询问都可以直接表示结果了。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<iostream>
 4 #include<map>
 5 #define inf 0x3f3f3f3f
 6 using namespace std;
 7 
 8 map<int, int>mp;
 9 int num[1000010];
10 int id[1000010];
11 
12 int main()
13 {
14     int n, q;
15     while(cin >> n >> q)
16     {
17         if (n == 0 && q == 0) break;
18         for (int i=0; i<n; ++i)
19         {
20             cin >> num[i];
21         }
22 
23         mp.clear();
24         id[n] = inf;
25 
26         for (int i=n-1; i>=0; --i)
27         {
28             if (mp[num[i]] == 0)
29             {
30                 id[i] = id[i+1];
31                 mp[num[i]] = i;
32                 continue;
33             }
34             else
35             {
36                id[i] = min(mp[num[i]], id[i+1]);
37                mp[num[i]] = i;
38             }
39         }
40 
41         while(q--)
42         {
43             int x, y;
44             cin >> x >> y;
45             x--;
46             y--;
47             if (y < id[x]) cout << "OK\n";
48             else cout << num[id[x]] << endl;
49         }
50         cout << endl;
51     }
52     return 0;
53 }
LOoK

 

posted on 2015-08-07 09:42  小小八  阅读(160)  评论(0编辑  收藏  举报