Light oj 1100 - Again Array Queries (鸽巢原理+暴力)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1100

给你n个数,数的范围是1~1000,给你q个询问,每个询问问你l到r之间数的最小差是多少。

要是l到r的数字个数大于1000,必定会有两个数字重复,所以此时最小差就为0。要是小于等于1000就直接暴力即可。

 1 //#pragma comment(linker, "/STACK:102400000, 102400000")
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <vector>
 8 #include <cmath>
 9 #include <ctime>
10 #include <list>
11 #include <set>
12 #include <map>
13 using namespace std;
14 typedef long long LL;
15 const int N = 1e5 + 5;
16 int a[N], cnt[1001];
17 
18 int main()
19 {
20     int t, n, q, l, r;
21     scanf("%d", &t);
22     for(int ca = 1; ca <= t; ++ca) {
23         scanf("%d %d", &n, &q);
24         for(int i = 0; i < n; ++i) {
25             scanf("%d", a + i);
26         }
27         printf("Case %d:\n", ca);
28         while(q--) {
29             scanf("%d %d", &l, &r);
30             if(r - l + 1 > 1000) {
31                 printf("%d\n", 0);
32             } else {
33                 for(int i = l; i <= r; ++i) {
34                     ++cnt[a[i]];
35                 }
36                 int ans = 1001, lpos = -1001;
37                 for(int i = 1; i <= 1000; ++i) {
38                     if(cnt[i] > 1) {
39                         ans = 0;
40                         break;
41                     } else if(cnt[i]) {
42                         ans = min(ans, i - lpos);
43                         lpos = i;
44                     }
45                 }
46                 for(int i = l; i <= r; ++i) {
47                     cnt[a[i]] = 0;
48                 }
49                 printf("%d\n", ans);
50             }
51         }
52     }
53     return 0;
54 }

 

posted @ 2016-09-16 14:28  Recoder  阅读(236)  评论(0编辑  收藏  举报