uva 11898 - Killer Problem

来源:互联网 发布:js中怎么获取name属性 编辑:程序博客网 时间:2024/06/10 04:53

  Killer Problem 

You are given an array of N integers and Q queries. Each query is a closed interval [lr]. You should find the minimum absolute difference between all pairs in that interval.

Input 

First line contains an integer T (T$ \le$10). T sets follow. Each set begins with an integer N ( N$ \le$200000). In the next line there are N integers ai ( 1$ \le$ai$ \le$104), the number in the i-th cell of the array. Next line will contain Q ( Q$ \le$104). Q lines follow, each containing two integers liri ( 1$ \le$liri$ \le$Nli < ri) describing the beginning and ending of of i-th range. Total number of queries will be less than 15000.

Output 

For the i-th query of each test output the minimum ajak| for li$ \le$jk$ \le$ri (j$ \ne$k) a single line.

Sample Input 

1101 2 4 7 11 10 8 5 1 1000041 101 23 58 10

Sample Output 

0134

大力出奇迹啊!10^8的算法也过了。主要是a的范围很小,可以用计数排序,然后找相邻两个间的差值,注意如果有某个数计数超过两次,则答案为0,然后停止循环,加上这个优化就过了。。。(后来认识到,区间范围大于10^4时,一定有某个数出现2次,所以复杂度是10^8)

#include <cstdio>#include <algorithm>#include <vector>#include <map>#include <queue>#include <iostream>#include <stack>#include <set>#include <cstring>#include <stdlib.h>#include <cmath>using namespace std;typedef long long LL;typedef pair<int, int> P;const int maxn = 200000 + 5;const int maxk = 10000 + 5;const int INF = 1000000000;int a[maxn];int countn[maxk];int main(){    int t;    scanf("%d", &t);    while(t--){        int n;        scanf("%d", &n);        int Max = 0;        for(int i = 1;i <= n;i++){            scanf("%d", &a[i]);            Max = max(Max, a[i]);        }        int q;        scanf("%d", &q);        while(q--){            int l, r;            scanf("%d%d", &l, &r);            memset(countn, 0, sizeof(countn));            int ans = INF;            for(int i = l;i <= r;i++){                countn[a[i]]++;                if(countn[a[i]]>1){                    ans = 0;                    break;                }            }            if(ans != 0){                int last = -1;                for(int i = 1;i <= Max;i++){                    if(countn[i] == 0) continue;                    if(countn[i] > 1){                        ans = 0;                        break;                    }                    if(last == -1){                        last = i;                        continue;                    }                    ans = min(ans, i-last);                    last = i;                }            }            printf("%d\n", ans);        }    }    return 0;}


0 0