Processing math: 100%
(Analysis by Benjamin Qi)

We can rephrase the problem as finding an integer h such that the number of cows who provided information inconsistent with Bessie hiding at h is minimized. For the first sample input, any h satisfying 3h5 is consistent with there being zero liars. For the second sample input, any h satisfying h1 or h2 is consistent with there being a single liar.

Of course, we don't have time to try all possible values of h. We can reduce the number of h we need to consider by observing that if we move h leftwards or rightward until it equals one of the pi provided in the input, the number of cows that are inconsistent with h either stays the same or decreases. For example, consider the first sample input:

So it suffices to only consider the case when h=pi for some i. That is,

minall integers h(# cows inconsistent with h)=min1iN(# cows inconsistent with h=pi).

For a single value of h, we can count the number of cows inconsistent with h in O(N) time by looping over all cows in the input. So the overall time complexity is O(N2).

Danny Mittal's code:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class CountingLiarsQuadratic {
 
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(in.readLine());
        Information[] infos = new Information[n];
        for (int j = 0; j < n; j++) {
            StringTokenizer tokenizer = new StringTokenizer(in.readLine());
            char direction = tokenizer.nextToken().charAt(0);
            int reference = Integer.parseInt(tokenizer.nextToken());
            infos[j] = new Information(direction, reference);
        }
        int answer = n;
        for (Information tight : infos) {
            int x = tight.reference;
            int liars = 0;
            for (Information info : infos) {
                if (info.direction == 'G' ? x < info.reference : x > info.reference) {
                    liars++;
                }
            }
            answer = Math.min(answer, liars);
        }
        System.out.println(answer);
    }
 
    public static class Information {
        public final char direction;
        public final int reference;
 
        public Information(char direction, int reference) {
            this.direction = direction;
            this.reference = reference;
        }
    }
}

Jichao Qian's code:

#include <stdio.h>
#include <stdint.h>
 
#include <vector>
#include <algorithm>
using namespace std;
 
 
int main()
{
    int N;
    scanf("%d", &N);
 
    vector<pair<int, int>> locations(N);
    for (int idx = 0; idx < N; ++idx)
    {
        char dir[10];
        scanf("%s", dir);
        scanf("%d", &locations[idx].first);
        if (dir[0] == 'G')
            locations[idx].second = -1;
        else
            locations[idx].second = +1;
    }
 
    int minLiars = N;
    sort(locations.begin(), locations.end());
 
    for (int idx = 0; idx < N; ++idx)
    {
        int numLiars = 0;
        for (int jdx = 0; jdx < idx; ++jdx)
            if (locations[jdx].second == 1)
                ++numLiars;
 
        for (int jdx = idx+1; jdx < N; ++jdx)
            if (locations[jdx].second == -1)
                ++numLiars;
 
        minLiars = min(numLiars, minLiars);
    }
 
    printf("%d\n", minLiars);
}

Bonus: Solve the problem in O(NlogN) time.