Problem:
Score : 700 points

Problem Statement

There are N cats.
We number them from 1 through N.

Each of the cats wears a hat.
Cat i says: "there are exactly a_i different colors among the N - 1 hats worn by the cats except me."

Determine whether there exists a sequence of colors of the hats that is consistent with the remarks of the cats.

Constraints

2 ≤ N ≤ 10^5

1 ≤ a_i ≤ N-1

Input

Input is given from Standard Input in the following format:

N
a_1 a_2 ... a_N

Output

Print Yes if there exists a sequence of colors of the hats that is consistent with the remarks of the cats; print No otherwise.

Sample Input 1

3
1 2 2

Sample Output 1

Yes

For example, if cat 1, 2 and 3 wears red, blue and blue hats, respectively, it is consistent with the remarks of the cats.

Sample Input 2

3
1 1 2

Sample Output 2

No

From the remark of cat 1, we can see that cat 2 and 3 wear hats of the same color.
Also, from the remark of cat 2, we can see that cat 1 and 3 wear hats of the same color.
Therefore, cat 1 and 2 wear hats of the same color, which contradicts the remark of cat 3.

Sample Input 3

5
4 3 4 3 4

Sample Output 3

No

Sample Input 4

3
2 2 2

Sample Output 4

Yes

Sample Input 5

4
2 2 2 2

Sample Output 5

Yes

Sample Input 6

5
3 3 3 3 3

Sample Output 6

No

Solution in C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
namespace AtCoder.AGC016
{
    class ColorfulHat
    {
        public static void Main()
        {
            var yes = "Yes";
            var no = "No";
            var n = int.Parse(ReadLine());
            var testinomial = ReadLine().Trim().Split(' ').Select(_ => int.Parse(_));
            var suspect = testinomial.Distinct().OrderBy(_ => _).ToArray();
            if (suspect.Length > 2) WriteLine(no);
            else if (suspect.Length == 2 && ((suspect[0] + 1) != suspect[1])) WriteLine(no);
            else {
                var smaller = new Color(suspect[0], n);
                var bigger = new Color(suspect[0] + 1, n);
                foreach (var t in testinomial) {
                    if (smaller == t) {
                        smaller.Many++;
                        bigger.Single++;
                    }
                    else {
                        bigger.Many++;
                    }
                }
                if (smaller.IsNotParadoxical() || bigger.IsNotParadoxical()) WriteLine(yes);
                else WriteLine(no);
            }
        }
        struct Color
        {
            int ColorNum;
            int Num;
            public int Single, Many;
            public Color(int color, int n)
            {
                ColorNum = color;
                Num = n;
                Single = Many = 0;
            }
            public static implicit operator int(Color c)
            {
                return c.ColorNum;
            }
            public bool IsNotParadoxical()
            {
                return Num == Single + Many && ColorNum >= Single + ((Many == 0) ? 0 : 1) && ColorNum <= Single + Many / 2;
            }
        }


    }
}