USACO 2011 Nov Silver

Problem 2. Cow Lineup

Cow Lineup
Problem 2: Cow Lineup [Brian Dean]

Farmer John has hired a professional photographer to take a picture of some of his cows. Since FJ’s cows represent a variety of different breeds, he would like the photo to contain at least one cow from each distinct breed present in his herd.

FJ’s N cows are all standing at various positions along a line, each described by an integer position (i.e., its x coordinate) as well as an integer breed ID. FJ plans to take a photograph of a contiguous range of cows along the line. The cost of this photograph is equal its size – that is, the difference between the maximum and minimum x coordinates of the cows in the range of the photograph.

Please help FJ by computing the minimum cost of a photograph in which there is at least one cow of each distinct breed appearing in FJ’s herd.

PROBLEM NAME: lineup

INPUT FORMAT:

  • Line 1: The number of cows, N (1 <= N <= 50,000).

  • Lines 2..1+N: Each line contains two space-separated positive integers specifying the x coordinate and breed ID of a single cow. Both numbers are at most 1 billion.

SAMPLE INPUT (file lineup.in):

6
25 7
26 1
15 1
22 3
20 1
30 1

INPUT DETAILS:

There are 6 cows, at positions 25,26,15,22,20,30, with respective breed IDs 7,1,1,3,1,1.

OUTPUT FORMAT:

  • Line 1: The smallest cost of a photograph containing each distinct breed ID.

SAMPLE OUTPUT (file lineup.out):

4

OUTPUT DETAILS:

The range from x=22 up through x=26 (of total size 4) contains each of the distinct breed IDs 1, 3, and 7 represented in FJ’s herd.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
ll N, K;

int main() {
    setIO("lineup");

    cin >> N >> K;

    vector<int> cows(N);
    F0R(i, N) {
        cin >> cows[i];
    }

    int amt = 0;
    int ans = 0;
    map<int, int> count;
    int l = 0, r = 0;
    while (r < N) {
        while (amt > K + 1) {
            count[cows[l]]--;
            if (count[cows[l]] == 0) {
                amt--;
            }
            l++;
        }
        if (count[cows[r]] == 0) {
            amt++;
        }
        count[cows[r]]++;
        ans = max(count[cows[r]], ans);
        r++;
    }

    cout << ans;
}