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: Accepted)

//#pragma GCC optimize(3)
#include<iostream>
#include<iomanip>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set> 
#include<map>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#define ll long long
#define db double
#define mxlen 1000+9
#define inf 100009
#define INF (int)1e9
#define pi acos(-1)
#define rd(n) {n=0;char ch;int f=0;do{ch=getchar();if(ch=='-'){f=1;}}while(ch<'0'||ch>'9');while('0'<=ch&&ch<='9'){n=(n<<1)+(n<<3)+ch-48;ch=getchar();}if(f)n=-n;}
using namespace std;

int n;
int a[inf];

int main(){
	rd(n)
	for (int i=1;i<=n;i++){
		rd(a[i])
	}
	sort(a+1,a+n+1);
	if (a[n]-a[1]>1){
		puts("No");
		return 0;
	}
	if (a[n]-a[1]==0){
		if (a[1]==n-1 || a[1]<=n/2){
			puts("Yes");
		}
		else{
			puts("No");
		}
		return 0;
	}
	int cnt1,cnt2;
	for (int i=1;i<n;i++){
		if (a[i]!=a[i+1]){
			cnt1=i;
			cnt2=n-i;
			break;
		}
	}
	if (a[1]<=cnt1-1){
		puts("No");
		return 0;
	}
	a[n]-=cnt1;
	if (!a[n]){
		puts("No");
		return 0;
	}
	int col;
	if (a[n]*2>cnt2){
		col=cnt2;
	}
	else if (a[n]<=cnt2/2){
		col=a[n];
	}
	else{
		puts("No");
		return 0;
	}
	if (col+cnt1-1!=a[1]){
		puts("No");
		return 0;
	}
	puts("Yes");
	return 0;
}