Problem:
Problem E:
トーマス・ライトの憂鬱
昨日の夕方の話。 普段通り大学での講義が終わり、日課であるキャンパスでの猫への餌付けを済ませた後、家に帰り着くと、作業着を着た人たちが僕の家の扉を取り替える工事をしていた。 それだけなら特に僕の頭痛の種を増やすような出来事ではないのだが、取り外されて去っていく慣れ親しんだ鍵とレバーがついている茶色の扉が非常に平凡であるのに対して、今からまさに取り付けられようとしている黒色の扉が非常に奇妙なもので、ああこれはまたうちの親父が何かを思いついてしまったのだなと容易に想像がついてしまうのであった。 その偏屈親父が言うには、鍵は無くす可能性があるので信用することが出来ない。手元に鍵があったとしても、目を離している隙に鍵の複製が作られてしまったかもしれない。物にセキュリティーを頼る時代はもう終わりだ。これからはパスワードを家族の各人が覚え、そうすることによって世界征服を目論む悪の科学者から我輩の発明品を守るのだ、ということらしい。 新しく設置された扉には縦にN個ずつ、横にN個ずつの正方形をかたちどるように、縦にN+1本、横にN+1本の線が薄青色で引かれていた。 一行目の正方形の左にはA、二行目の正方形の左にはB、というように、ご丁寧に行番号が書かれている。 一列目の正方形の上には1、二列目の正方形の上には2、と、列番号はどうやら数字のようだ。 N
2
個の正方形には各々スイッチが一つずつ配置されており、OFFの状態だと真っ黒だが、ONの状態だと赤い丸が浮かび上がる、というセキュリティーを考えるならもう少しやりようがあるだろうというギミックが付いている。 そして全てのスイッチのON/OFFを正しく合わせたときのみ、扉が開く、という派手好きの親父が大満足な仕様となっているようだ。
さて、ここでの僕の問題は、このパスワードをきちんと覚えられる自信が無い、ということだ。 自分で言うのも何なのだが、僕は頭がそんなに悪くないつもりなので、パスワードの大体は覚えていられるだろうと思うのだが、機械という物は融通が効かないものだからほんのちょっと間違っただけで、寒空の下で夜を過ごすことになりかねない。 しかし、パスワードを書き写して持ち運べば、親父に見つかったときに小遣い抜きなどの理不尽な制裁が加えられることが予想される。 そこで僕はある作戦を思いついたんだ。 各行、各列の正方形に含まれる赤丸の個数をメモしてそれを持ち運ぼう。 一行目のN個の正方形に含まれる赤丸の個数、二行目のN個の....、 一列目のN個の正方形に含まれる赤丸の個数、二行目のN個の....、 という風に2N個の数字をメモしておけば、もし他の人に見られてもただの数字の羅列だ。何が何だかきっと分からないだろう。
やあわざわざここまで読んでくれた君。 ああそうだ、この作戦にはもしかしたら致命的な欠陥があるかもしれない。 複数のパスワードが、同じメモになってしまうかもしれないのだ。 そうなると、寒空(略)ということになりかねない。我が身の健康を揺るがす一大問題だ。 そこで君には、このメモの数字を入力すると、復元可能なパスワードが一つに定まるかどうかを判定するプログラムを書いてほしい。 一つに定まるなら、Yes、そうでないなら、Noと出力するだけのプログラムさ。簡単だろう？ もしかしたらメモをとった時に赤丸を数え間違ったかもしれない。その場合は復元できるパスワードが1つも存在しないかもしれないが、その時は迷わずNoと返してくれ。 ああそうそう、間違っても僕の家に勝手に入ろうとはしないでくれよ。親父の趣味の危ない機械や罠が並んでいるから、命の保証が出来ないからね。
Input
入力は次のような形式で与えられる。
N
1行目の和 2行目の和 ...
1列目の和 2列目の和 ...
ただし、N は 1 ≤ N ≤ 10000 を満たす整数である。
Output
問題文に従って、YesもしくはNoを出力せよ。
Notes on Test Cases
上記入力形式で複数のデータセットが与えられます。各データセットに対して上記出力形式で出力を行うプログラムを作成して下さい。
N が 0 のとき入力の終わりを示します。
Sample Input
2
1 2
2 1
3
2 1 2
2 1 2
10
0 1 1 2 5 5 5 8 8 9
0 1 3 3 3 6 6 6 7 9
0
Output for Sample Input
Yes
No
Yes

Submitted solutions:

code_snippet: #include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main() {
	int n,t;
	for(;(cin>>n),n;){
		vector<int> r,l;
		bool ok=true;
		for(int i=0;i<n;i++)(cin>>t),r.push_back(t);
		for(int i=0;i<n;i++)(cin>>t),l.push_back(t);
		std::sort(r.begin(),r.end(),greater<int>());
		std::sort(l.begin(),l.end(),greater<int>());
		for(int i=0;i<n;i++){
			for(int j=0;j<r[i];j++){
				l[j]--;
				if(l[j]<0)ok=false;
			}
		}
		for(int i=0;i<n;i++){
			if(l[i]!=0)ok=false;
		}
		if(ok){
			cout<<"Yes"<<endl;
		}else{
			cout<<"No"<<endl;
		}
	}
	return 0;
}
accuracy: 1
time_ms: 30
memory_kb: 3552
final_rank: 16

code_snippet: #include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cfloat>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <iostream>
#include <set>
#include <map>
#include <time.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


int N;

int yoko[10000],tate[10000],yoko_sum,tate_sum,tate_num;


void func(){

	yoko_sum = tate_sum = 0;

	for(int i = 0; i < N; i++){
		scanf("%d",&yoko[i]);
		yoko_sum += yoko[i];
	}
	sort(yoko,yoko+N);
	reverse(yoko,yoko+N);

	int tate_num = 0;

	for(int i = 0; i < N; i++){
		scanf("%d",&tate[i]);
		tate_sum += tate[i];
		if(tate[i] > 0)tate_num++;
	}

	if(yoko_sum != tate_sum){
		printf("No\n");
		return;
	}

	for(int i = 0; i < N; i++){
		if(yoko[i] != tate_num){
			printf("No\n");
			return;
		}
		for(int k = 0; k < N; k++){
			if(tate[k] > 0){
				tate[k]--;
				if(tate[k] == 0)tate_num--;
			}
		}
	}

	printf("Yes\n");
}

int main(){

	while(true){
		scanf("%d",&N);
		if(N == 0)break;

		func();
	}

	return 0;
}
accuracy: 1
time_ms: 60
memory_kb: 3276
final_rank: 15

code_snippet: #include "bits/stdc++.h"
#include <cassert>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define all(a)  (a).begin(),(a).end()
#define vi vector<int>
#define pb push_back
#define INF 999999999
//#define INF (1LL<<59)


int main(){
	int n;
	while(cin>>n&&n){
		vi r(n),c(n);
		rep(i,n)cin>>r[i];
		rep(i,n)cin>>c[i];
		
		sort(all(r),greater<int>());
		sort(all(c),greater<int>());
		
		rep(col,n){
			rep(row,n){
				if(r[row]>0){
					r[row]--;
					c[col]--;
				}
			}
		}
		
		bool can=true;
		rep(i,n){
			if(c[i]!=0)can=false;
		}
		rep(i,n){
			if(r[i]!=0)can=false;
		}
		
		if(can)cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
}
accuracy: 1
time_ms: 110
memory_kb: 3136
final_rank: 17

code_snippet: #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<list>
#include<queue>
#include<deque>
#include<algorithm>
#include<numeric>
#include<utility>
#include<complex>
#include<functional>
 
using namespace std;

/* constant */

const int MAX_N = 10000;

/* typedef */

/* global variables */

int n;
int hsums[MAX_N], vsums[MAX_N];

/* subroutines */

/* main */

int main() {
  for (;;) {
    cin >> n;
    if (n == 0) break;

    for (int i = 0; i < n; i++) cin >> hsums[i];
    for (int i = 0; i < n; i++) cin >> vsums[i];
    sort(hsums, hsums + n);
    sort(vsums, vsums + n);

    int hmin = 0, hmax = n, hp0 = 0, hp1 = n - 1;
    int vmin = 0, vmax = n, vp0 = 0, vp1 = n - 1;
    bool changed = true;

    while (changed) {
      changed = false;

      while (hp0 <= hp1 && hsums[hp0] == hmin)
	hp0++, vmax--, changed = true;
      while (hp0 <= hp1 && hsums[hp1] == hmax)
	hp1--, vmin++, changed = true;

      if (hp0 <= hp1 && (hsums[hp0] < hmin || hsums[hp1] > hmax)) break;

      while (vp0 <= vp1 && vsums[vp0] == vmin)
	vp0++, hmax--, changed = true;
      while (vp0 <= vp1 && vsums[vp1] == vmax)
	vp1--, hmin++, changed = true;
	
      if (vp0 <= vp1 && (vsums[vp0] < vmin || vsums[vp1] > vmax)) break;
    }

    bool ok = (hp0 > hp1 && vp0 > vp1);
    cout << (ok ? "Yes" : "No") << endl;
  }

  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 1248
final_rank: 2

code_snippet: #include <iostream>
#include <complex>
#include <sstream>
#include <string>
#include <algorithm>
#include <deque>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <vector>
#include <set>
#include <limits>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <ctime>
using namespace std;
#define REP(i, j) for(int i = 0; i < (int)(j); ++i)
#define FOR(i, j, k) for(int i = (int)(j); i < (int)(k); ++i)
#define SORT(v) sort((v).begin(), (v).end())
#define REVERSE(v) reverse((v).begin(), (v).end())
typedef complex<double> P;

int N;

bool solve(vector<int> &H, vector<int> &W){
  REP(i, N) REP(j, N) if(W[j] > 0) { W[j]--; H[i]--; }
  REP(i, N) if(H[i] != 0) return 0;
  return 1;
}

int main() {
  while(cin >>N && N){
    vector<int> H(N), W(N);
    REP(i, N) cin >>H[i];
    REP(i, N) cin >>W[i];
    SORT(H); REVERSE(H);
    cout <<(solve(H, W) ? "Yes" : "No") <<endl;
  }
  return 0;
}
accuracy: 1
time_ms: 140
memory_kb: 1284
final_rank: 10

code_snippet: #include<iostream>
#include<algorithm>
#include<queue>

using namespace std;

#define rep(i, n) for (int i = 0; i < int(n); ++i)

int main() {
  while (true) {
    int n;
    cin >> n;
    if (n == 0) break;
    deque<int> a(n), b(n);
    rep (i, n) cin >> a[i];
    rep (i, n) cin >> b[i];
    sort(a.begin(), a.end());
    sort(b.begin(), b.end());
    int na = 0, nb = 0;
    rep (i, n) if (a[i] == 0) ++na;
    rep (i, n) if (b[i] == 0) ++nb;
    rep (_, 2 * n) {
      if (a[n - 1] > 0 && a[n - 1] + nb == n) {
	rep (i, n) if (b[i] > 0) {
	  --b[i];
	  if (b[i] == 0) ++nb;
	}
	++na;
	a.push_front(0);
	a.pop_back();
      }
      if (b[n - 1] > 0 && b[n - 1] + na == n) {
	rep (i, n) if (a[i] > 0) {
	  --a[i];
	  if (a[i] == 0) ++na;
	}
	++nb;
	b.push_front(0);
	b.pop_back();
      }
    }
    if (na == n && nb == n) {
      cout << "Yes" << endl;
    } else {
      cout << "No" << endl;
    }
  }
}
accuracy: 1
time_ms: 350
memory_kb: 1312
final_rank: 14

code_snippet: #include <iostream>
#include <algorithm>
using namespace std;

int main() {
  
  int n;
  int w[10000], h[10000];
  while(cin >> n && n) {
    for(int i=0; i<n; i++) cin >> w[i];
    for(int i=0; i<n; i++) cin >> h[i];
    sort(h, h+n, greater<int>());
    
    for(int i=0; i<n; i++)
      for(int j=0; j<n; j++)
	if(w[j]) w[j] --, h[i] --;
    
    bool ok = 1;
    for(int i=0; i<n; i++)
      if(h[i]) { ok = 0; }
    
    if(ok) cout << "Yes" << endl;
    else cout << "No"<< endl;
  }
  
  return 0;
}
accuracy: 1
time_ms: 150
memory_kb: 1248
final_rank: 11

code_snippet: #include<iostream>
#include<algorithm>

#define REP(i,s,n) for(int i=s;i<n;i++)
#define rep(i,n) REP(i,0,n)
#define MAX 10010

using namespace std;

int r[MAX],c[MAX];

int main(){
  int n;
  while(cin >> n,n){
    rep(i,n)cin >> r[i]; 
    rep(i,n)cin >> c[i];
    sort(r,r+n,greater<int>());
    sort(c,c+n,greater<int>());
    bool judge = true;
    if(r[0] > n || c[0] > n)judge = false;
    rep(i,n){
      if(!judge)break;
      rep(j,c[i])r[j]--;
    }
    rep(i,n)if(r[i] != 0)judge = false;
    cout << (judge?"Yes":"No") << endl;
  }
  return 0;
}
accuracy: 1
time_ms: 50
memory_kb: 1248
final_rank: 4

code_snippet: #include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define INF ( 1 << 28 )
#define reps(i,j,n) for(int i = (j) ; i < (n) ; i++ )
#define rep(i,n) reps(i,0,n)

int main(){
  int N;
  while(cin >> N , N){
    bool flg = true;
    vector<int> a(N),b(N);
    rep(i,N) cin >> a[i];
    rep(i,N) cin >> b[i];
    sort(b.rbegin(),b.rend());
    rep(i,N){
      rep(j,N) if(a[j] > 0) a[j]--,b[i]--;
      if(b[i] != 0){
        flg = false;
        break;
      }
    }
    cout << (flg ? "Yes" : "No") << endl;
  }
}
accuracy: 1
time_ms: 140
memory_kb: 1268
final_rank: 9

code_snippet: #include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
  for(;;){
    int n;
    cin >> n;
    if(n==0) break;
    vector<int> r(n),c(n);
    for(int i=0; i<n; i++){
      cin >> r[i];
    }
    for(int i=0; i<n; i++){
      cin >> c[i];
    }
    sort(r.begin(),r.end());
    sort(c.rbegin(),c.rend());
    bool bOK = true;
    for(int i=0; i<n; i++){
      int count = 0;
      for(int j=0; j<n; j++){
        if(r[j] > 0){
          count++;
          r[j]--;
        }
      }
      if(c[i] != count){
        bOK = false;
        break;
      }
    }
    if(bOK) cout << "Yes" << endl;
    else cout << "No" << endl;
  }
  return 0;
}
accuracy: 1
time_ms: 70
memory_kb: 1284
final_rank: 6

code_snippet: #define _USE_MATH_DEFINES
#define INF 0x3f3f3f3f
#include <cstdio>
#include <iostream>
#include <sstream>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <limits>
#include <map>
#include <string>
#include <cstring>
#include <set>
#include <deque>
#include <bitset>
#include <list>
#include <cctype>
#include <utility>
 
using namespace std;
 
typedef long long ll;
typedef pair <int,int> P;
typedef pair <int,P > PP;
 
int tx[] = {0,1,0,-1};
int ty[] = {-1,0,1,0};
 
static const double EPS = 1e-8;
 
 
 
int main(){
  int N;
  while(~scanf("%d",&N)){
    if(N==0) break;
 
    vector<int> row;
    vector<int> col;
    for(int i=0;i<N;i++){
      int num;
      cin >> num;
      row.push_back(num);
    }
 
    for(int i=0;i<N;i++){
      int num;
      cin >> num;
      col.push_back(num);
    }
    sort(col.begin(),col.end(),greater<int>());
 
    bool isok = true;
    for(int i=0;i<col.size();i++){           
      for(int j=0;j<row.size();j++){
	if(row[j] > 0){
	  col[i]--;
	  row[j]--;
	}
      }
    }
 
    if(count(col.begin(),col.end(),0) != col.size()
       || count(row.begin(),row.end(),0) != row.size()){
      isok = false;
    }
 
    printf("%s\n",isok ? "Yes" : "No");
  }
}
accuracy: 1
time_ms: 160
memory_kb: 1360
final_rank: 12

code_snippet: #define _USE_MATH_DEFINES
#define INF 0x3f3f3f3f
#include <cstdio>
#include <iostream>
#include <sstream>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <limits>
#include <map>
#include <string>
#include <cstring>
#include <set>
#include <deque>
#include <bitset>
#include <list>
#include <cctype>
#include <utility>

using namespace std;

typedef long long ll;
typedef pair <int,int> P;
typedef pair <int,P > PP;

int tx[] = {0,1,0,-1};
int ty[] = {-1,0,1,0};

static const double EPS = 1e-8;



int main(){
	int N;
	while(~scanf("%d",&N)){
		if(N==0) break;

		vector<int> row;
		vector<int> col;
		for(int i=0;i<N;i++){
			int num;
			cin >> num;
			row.push_back(num);
		}

		for(int i=0;i<N;i++){
			int num;
			cin >> num;
			col.push_back(num);
		}
		sort(col.begin(),col.end(),greater<int>());

		bool isok = true;
		for(int i=0;i<col.size();i++){			
			for(int j=0;j<row.size();j++){
				if(row[j] > 0){
					col[i]--;
					row[j]--;
				}
			}
		}

		if(count(col.begin(),col.end(),0) != col.size()
			|| count(row.begin(),row.end(),0) != row.size()){
				isok = false;
		}

		printf("%s\n",isok ? "Yes" : "No");
	}
}
accuracy: 1
time_ms: 170
memory_kb: 1360
final_rank: 13

code_snippet: #include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cassert>

using namespace std;

#define FOR(i,k,n) for(int i=(k); i<(int)(n); ++i)
#define REP(i,n) FOR(i,0,n)
#define FORIT(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)

template<class T> void debug(T begin, T end){ for(T i = begin; i != end; ++i) cerr<<*i<<" "; cerr<<endl; }
inline bool valid(int x, int y, int W, int H){ return (x >= 0 && y >= 0 && x < W && y < H); }

typedef long long ll;
const int INF = 100000000;
const double EPS = 1e-8;
const int MOD = 1000000007;
int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};
int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};
bool solve(vector<int>& a, vector<int>& b){
  int N = a.size();
  sort(a.begin(), a.end(), greater<int>());
  sort(b.begin(), b.end(), greater<int>());
  for(int i = 0; i < N; i++){
    int x = a[i];
    if(x == 0) break;
    if(x > N) return false;
    if(b[x - 1] <= 0) return false;
    if(x != N && b[x] == b[x - 1]) return false;
    for(int j = 0; j < x; j++){ b[j] --; }
  }
  for(int i = 0; i < N; i++) if(b[i] != 0) return false;
  return true;
}

int main(){
  int N;
  while(cin>>N && N){
    vector<int> a(N), b(N);
    REP(i, N) cin>>a[i];
    REP(i, N) cin>>b[i];
    if(solve(a, b)) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
  }
  return 0;
}
accuracy: 1
time_ms: 40
memory_kb: 1284
final_rank: 3

code_snippet: #include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cassert>

using namespace std;

#define FOR(i,k,n) for(int i=(k); i<(int)(n); ++i)
#define REP(i,n) FOR(i,0,n)
#define FORIT(i,c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)

template<class T> void debug(T begin, T end){ for(T i = begin; i != end; ++i) cerr<<*i<<" "; cerr<<endl; }
inline bool valid(int x, int y, int W, int H){ return (x >= 0 && y >= 0 && x < W && y < H); }

typedef long long ll;
const int INF = 100000000;
const double EPS = 1e-8;
const int MOD = 1000000007;
int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};
int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};
bool solve(vector<int>& a, vector<int>& b){
  int N = a.size();
  sort(a.begin(), a.end(), greater<int>());
  sort(b.begin(), b.end(), greater<int>());
  for(int i = 0; i < N; i++){
    int x = a[i];
    if(x == 0) break;
    if(x > N) return false;
    if(b[x - 1] <= 0) return false;
    if(x != N && b[x] == b[x - 1]) return false;
    for(int j = 0; j < x; j++){ b[j] --; }
    sort(b.begin(), b.end(), greater<int>());
  }
  for(int i = 0; i < N; i++) if(b[i] != 0) return false;
  return true;
}

int main(){
  int N;
  while(cin>>N && N){
    vector<int> a(N), b(N);
    REP(i, N) cin>>a[i];
    REP(i, N) cin>>b[i];
    if(solve(a, b)) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
  }
  return 0;
}
accuracy: 1
time_ms: 940
memory_kb: 1284
final_rank: 20

code_snippet: #include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <list>

using namespace std;

int
main (
  int   argc,
  char *argv[ ]
  )
{
  list<int>::iterator it;
  int i;

  for ( ; ; )
  {
    list<int> h, v;
    int n;

    scanf ( "%d", &n );
    if ( n == 0 ) break ;
    for ( i = 0; i < n; ++i )
    {
      int d;

      scanf ( "%d", &d );
      h.push_back ( d );
    }
    for ( i = 0; i < n; ++i )
    {
      int d;

      scanf ( "%d", &d );
      v.push_back ( d );
    }

    for ( ; ; )
    {
      it = find ( h.begin ( ), h.end ( ), 0 );
      if ( it != h.end ( ) )
      {
        h.erase ( it );
        continue ;
      }
      it = find ( v.begin ( ), v.end ( ), 0 );
      if ( it != v.end ( ) )
      {
        v.erase ( it );
        continue ;
      }

      it = find ( h.begin ( ), h.end ( ), v.size ( ) );
      if ( it != h.end ( ) )
      {
        h.erase ( it );
        for ( it = v.begin ( ); it != v.end ( ); ++it )
        {
          *it -= 1;
        }
        continue ;
      }
      it = find ( v.begin ( ), v.end ( ), h.size ( ) );
      if ( it != v.end ( ) )
      {
        v.erase ( it );
        for ( it = h.begin ( ); it != h.end ( ); ++it )
        {
          *it -= 1;
        }
        continue ;
      }

      break ;
    }
    
    puts ( ( h.size ( ) == 0 && v.size ( ) == 0 )
         ? "Yes" : "No" );
  }

  return ( EXIT_SUCCESS );
}
accuracy: 1
time_ms: 580
memory_kb: 1644
final_rank: 18

code_snippet: //10
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>

using namespace std;

int main(){
  for(int n;cin>>n,n;){
    vector<int> c(n),r(n);
    for(int i=0;i<n;i++){
      cin>>c[i];
    }
    sort(c.begin(),c.end());
    for(int i=0;i<n;i++){
      cin>>r[i];
    }
    sort(r.begin(),r.end(),greater<int>());
    for(;;){
      bool u=false;
      for(;;){
	if(c.empty())goto end;
	if(c.back()!=r.size())break;
	c.pop_back();
	u=true;
	for(int i=0;i<r.size();i++){
	  r[i]--;
	}
      }
      for(;;){
	if(r.empty())goto end;
	if(r.back())break;
	r.pop_back();
	u=true;
      }
      if(!u)break;
    }
  end:
    cout<<((c.empty()||r.empty())?"Yes":"No")<<endl;
  }
  return 0;
}
accuracy: 1
time_ms: 50
memory_kb: 1288
final_rank: 5

code_snippet: #include<cstdio>
#include<algorithm>

#define rep(i,n) for(int i=0;i<(n);i++)

using namespace std;

int n,row[10000],col[10000];

bool solve(){
	sort(row,row+n);
	for(int i=n-1;i>=0;i--){
		rep(j,n){
			if(col[j]>0) col[j]--, row[i]--;
		}
		if(row[i]!=0) return false;
	}
	return true;
}

int main(){
	for(;scanf("%d",&n),n;){
		rep(i,n) scanf("%d",row+i);
		rep(j,n) scanf("%d",col+j);
		puts(solve()?"Yes":"No");
	}
	return 0;
}
accuracy: 1
time_ms: 160
memory_kb: 808
final_rank: 7

code_snippet: #include <iostream>
#include <algorithm>

using namespace std;

const int N = 10000;
int n;
int r[N];
int c[N];

void solve()
{
	sort(r, r + n);
	sort(c, c + n);
	for (int i = 0; i < n; i++) {
		if (r[n - i - 1] != (c + n - lower_bound(c, c + n, i + 1))) {
			cout << "No" << endl;
			return;
		}
	}
	cout << "Yes" << endl;
}

int main()
{
	while (cin >> n, n) {
		for (int i = 0; i < n; i++) {
			cin >> r[i];
		}
		for (int i = 0; i < n; i++) {
			cin >> c[i];
		}
		solve();
	}
	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 0
final_rank: 1

code_snippet: #include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
#include <numeric>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <cmath>
using namespace std;

int W[10001];
int H[10001];

int main() {
    int n;
    while ( cin >> n && n ) {
        for ( int i = 0; i < n; i++ ) {
            cin >> W[i];
        }
        for ( int i = 0; i < n; i++ ) {
            cin >> H[i];
        }
        sort( H, H+n, greater<int>() );

        for ( int i = 0; i < n; i++ ) {
            for ( int j = 0; j < n; j++ ) {
                if ( W[j] > 0 ) {
                    W[j]--;
                    H[i]--;
                }
            }
        }

        bool flag = true;
        for ( int i = 0; i < n; i++ ) {
            if ( H[i] != 0 ) flag = false;
        }
        cout << ( flag ? "Yes" : "No" ) << endl;
    }
    return 0;
}
accuracy: 1
time_ms: 180
memory_kb: 928
final_rank: 8

code_snippet: #include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cstdlib>

using namespace std;
typedef long long ll;

int n;
int aa[10001];
int bb[10001];

const int MAX_N=10001;
const int MAX_Q=10001;
const int DAT_SIZE=(1<<18)-1;
//int N,Q;
//int A[MAX_N];
//char T[MAX_Q];
//int L[MAX_Q],R[MAX_Q],X[MAX_Q];

// segmentation tree
ll data[DAT_SIZE];
ll datb[DAT_SIZE];

// [a,b)ÉxðÁZ
// kÍß_ÌÔÅAæÔ[l,r)ÉÎ
void add(int a,int b,int x,int k,int l,int r){
    if(a<=l&&r<=b)
        data[k]+=x;
    else if(l<b&&a<r){
        datb[k]+=(min(b,r)-max(a,l))*x;
        add(a,b,x,k*2+1,l,(l+r)/2);
        add(a,b,x,k*2+2,(l+r)/2,r);
    }
}
// [a,b)ÌaðvZ
// kÍß_ÌÔÅAæÔ[l,r)ÉÎ
ll sum(int a,int b,int k,int l,int r){
    if(b<=l||r<=a)
        return 0;
    else if(a<=l&&r<=b)
        return data[k]*(r-l)+datb[k];
    ll res=(min(b,r)-max(a,l))*data[k];
    res+=sum(a,b,k*2+1,l,(l+r)/2);
    res+=sum(a,b,k*2+2,(l+r)/2,r);
    return res;
}

int main(){

    while(cin>>n&&n!=0){
        // [NA
        memset(data,0,sizeof(data));
        memset(datb,0,sizeof(datb));
        for(int i = 0; i < n; i++)cin>>aa[i];
        for(int i = 0; i < n; i++)cin>>bb[i];
        sort(aa,aa+n);
        sort(bb,bb+n);
        int havingZeroCow=-1;
        // »Ý0ðÂàÁÆàEÌñ
        for(int i = 0; i < n; i++){
            if(bb[i]==0)
                havingZeroCow=i;
            else
                break;
        }
        // seg treeÉúlðÁZ
        for(int i = 0; i < n; i++)
            add(i,i+1,bb[i],0,0,n);
        bool f=false;
        // àÁÆàå«¢ðÂs©çÔÉ
        for(int i = n-1; i >= 0; i--){
            // E©çÔÉßÄ¢ÁÄAÅÉóÉÈéñ
            int firstEmpty=n-aa[i]-1;
            if(firstEmpty==-1||sum(firstEmpty,firstEmpty+1,0,0,n)==0)
                add(firstEmpty+1,n,-1,0,0,n);
            else{
                f=true;
                break;
            }
        }
        if(f)
            cout<<"No"<<endl;
        else
            cout<<"Yes"<<endl;
    }

    return 0;
}
accuracy: 1
time_ms: 40
memory_kb: 5032
final_rank: 19