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

#include<bits/stdc++.h>
#define range(i,a,b) for(int i = (a); i < (b); i++)
#define rep(i,b) for(int i = 0; i < (b); i++)
#define all(a) (a).begin(), (a).end()
#define show(x)  cerr << #x << " = " << (x) << endl;
//const int INF = 1e8;
using namespace std;

int main(){
	int n;
	cin >> n;

	vector<int> v(n);
	map<int,int> m;
	int maxi = 0, mini = 1e8;
	rep(i,n){
		cin >> v[i];
		mini = min(mini, v[i]);
		maxi = max(maxi, v[i]);
		m[v[i]]++;
	}


	if(maxi - mini >= 2){
		cout << "No" << endl;
		return 0;
	}

	if(maxi - mini == 0){
		if(v[0] == n - 1){
			cout << "Yes" << endl;
		}else if(v[0] * 2 <= n){
			cout << "Yes" << endl;
		}else{
			cout << "No" << endl;
		}
	}else{
		//if(m[maxi] - 1 == n - 1 - mini){
		int mins = count(all(v),mini);
		int maxs = count(all(v),maxi);
		if(mini == mins){
		//if(mins < maxi && 2 * (maxi - mins) < maxs){
			cout << "Yes" << endl;
		}else{
			cout << "No" << endl;
		}
	}
}