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++ (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <iostream>
#include <cstdio>
#define gc getchar()
#define pc putchar
#define rep(i,x,p) for(int i = x;i <= p;++ i)
#define sep(i,x,p) for(int i = x;i >= p;-- i)
using namespace std;
const int maxN = 1e5 + 7;

int a[maxN];

inline int read() {
	int x = 0 ,f = 1;char c = gc;
	while(c < '0' || c > '9') {if(c == '-')f = -1;c = gc;}
	while(c >= '0' && c <= '9') {x = x * 10 + c - '0';c = gc;}
	return x * f;
}

void print(int x) {
	if(x < 0) {
		pc('-');
		x = -x;
	}
	if(x >= 10) print(x / 10);
	pc(x % 10 + '0');
}

int main() {
	int n,maxx = 0, minn = 1e6;
	n = read();
	rep(i,1,n) a[i] = read();
	rep(i,1,n) maxx = max(maxx,a[i]);
	rep(i,1,n) minn = max(minn,a[i]);
	if(maxx != minn + 1 && maxx != minn)  {puts("No");return 0;}
	if(maxx == minn) {
		if(a[1] == n - 1 || 2 * a[1] <= n) puts("Yes");
		else puts("No");
		return 0;
	}
	int cnt = 0;
	rep(i , 1 , n) if(a[i] == minn) cnt ++;
	if(cnt >= maxx || 2 * (maxx - cnt) > n - cnt) puts("No");
	else puts("Yes");
	return 0;
}