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)

// stuff_project.cpp : Defines the entry point for the console application.
//
//#include "stdafx.h"


#include<iostream>
#include<vector>
#include<algorithm>
#include<string>


#define INF 1000010000
#define nl '\n'
#define pb push_back
#define ppb pop_back
#define mp make_pair
#define fi first
#define se second
#define pii pair<int,int>
#define pdd pair<double,double>
#define all(c) (c).begin(), (c).end()
#define SORT(c) sort(all(c))
#define sz(c) (c).size()
#define rep(i,n) for( int i = 0; i < n; ++i )
#define repi(i,n) for( int i = 1 ; i <= n; ++i )
#define repn(i,n) for( int i = n - 1 ; i >= 0 ; --i )
#define repf(j,i,n) for( int j = i ; j < n ; ++j )
#define die(s) {std::cout << s << nl;}
#define dier(s) {std::cout << s; return 0;}
#define vi vector<int>
typedef long long ll;
#define MAXN 1010101
using namespace std;

vi pr(MAXN, 0);
vi ra(MAXN, 1);

inline int find_set(int v) {
	return v == pr[v] ? v : pr[v] = find_set(pr[v]);
}

void union_sets(int a, int b) {
	a = find_set(a);
	b = find_set(b);
	if (a != b) {
		if (ra[a] < ra[b])swap(a, b);
		ra[a] += ra[b];
		pr[b] = a;
	}
}


int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.precision(0);

	int n;
	cin >> n;
	vi v(n);
	rep(i, n) {
		cin >> v[i];
		pr[i] = i;
		if (v[i] >= n)dier("No");
	}
	SORT(v);
	if (v[0] == v[n - 1]) {
		if(v[0] == 0 || v[0] == n - 1)
			dier("Yes");
	}
	
	rep(i , n) {
		int cur = v[i] - 1;
	//	cout << i << " " << cur << nl;
		for (int j = 0; j < cur ; ++j) {
			int nxt = i + j + 1;
		//	cout << nxt << " ee\n";
			if (nxt >= n)dier("No");
			if (v[nxt] != v[i])dier("No");
			union_sets(i, nxt);
		}
		i += cur;
	}

	rep(i, n) {
		if (ra[find_set(i)] != v[i]) {
			dier("No");
		}
	}
	cout << "Yes";





//	system("pause");
	return 0;
}