at coder beginner 050

B
問題文
joisinoお姉ちゃんは、あるプログラミングコンテストの決勝を控えています。 このコンテストでは、N 問の問題が用意されており、それらには 1~N の番号がついています。 joisinoお姉ちゃんは、問題 i(1≦i≦N) を解くのにかかる時間が Ti 秒であることを知っています。
また、このコンテストでは、M 種類のドリンクが提供されており、1~M の番号がついています。 そして、ドリンク i(1≦i≦M) を飲むと、脳が刺激され、問題 Pi を解くのにかかる時間が Xi 秒になります。 他の問題を解くのにかかる時間に変化はありません。
コンテスタントは、コンテスト開始前にいずれかのドリンクを 1 本だけ飲むことができます。 joisinoお姉ちゃんは、それぞれのドリンクについて、それを飲んだ際に、全ての問題を解くのに何秒必要なのかを知りたくなりました。 全ての問題を解くのに必要な時間とは、それぞれの問題を解くのにかかる時間の合計です。 あなたの仕事は、joisinoお姉ちゃんの代わりにこれを求めるプログラムを作成することです。

```
#include<iostream>
using namespace std;
int main() {
	int N;
	int T[110];
	int M;
	int P[110];
	int X[110];
	cin >> N;
	int beforetime = 0;
	for (int i = 0; i < N; ++i) {
		cin >> T[i];
		beforetime += T[i];
	}
	cin >> M;
	int aftertime[110];
	for (int i = 0; i < M; ++i) {
		aftertime[i] = beforetime;
	}
	for (int i = 0; i < M; ++i) {
		cin >> P[i] >> X[i];
		aftertime[i] = (aftertime[i] - T[P[i]-1] + X[i]);
	}
	for (int i = 0; i < M; ++i) {
		cout << aftertime[i] << endl;
	}
	return 0;
}
```
C
1~N までの番号がついた、N 人の人がいます。 彼らは昨日、ある順番で左右一列に並んでいましたが、今日になってその並び方が分からなくなってしまいました。 しかし、彼らは全員、「自分の左に並んでいた人数と自分の右に並んでいた人数の差の絶対値」を覚えています。 彼らの報告によると、人 i の、「自分の左に並んでいた人数と自分の右に並んでいた人数の差の絶対値」は Ai です。
彼らの報告を元に、元の並び方が何通りあり得るかを求めてください。 ただし、答えは非常に大きくなることがあるので、109+7 で割った余りを出力してください。 また、彼らの報告が間違っており、ありうる並び方がないこともありえます。 その際は 0 を出力してください。
制約
1≦N≦105
0≦Ai≦N−1

```
#include<iostream>
#define mod 1000000007
using namespace std;
int main() {
	int N;
	int A[100001];
	int count[100001];
	long long ans = 1;
	cin >> N;
	for (int i = 0; i < N; ++i) {
		cin >> A[i];
	}
	for (int i = 0; i < N; ++i) {
		count[i] = 0;
	}
	if (N % 2 == 0) {
		for (int i = 0; i < N; i++) {
			for (int j = 1; j < N; j += 2) {
				if (A[i] == j)
					count[j]++;
			}
		}
		for (int i = 1; i < N; i += 2) {
			if (count[i] != 2) {
				cout << 0 << endl;
				return 0;
			}
		}
		for (int i = 0; i < N / 2; ++i) {
			ans = ans * 2 % mod;
		}
		cout << ans << endl;
	}
	else {
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < N; j += 2) {
				if (A[i] == j)
					count[j]++;
			}
		}
		if (count[0] != 1) {
			cout << 0 << endl;
			return 0;
		}
		for (int i = 2; i < N; i += 2) {
			if (count[i] != 2) {
				cout << 0 << endl;
				return 0;
			}
		}
		for (int i = 0; i < (N-1) / 2; ++i) {
			ans = ans * 2 % mod;
		}
		cout << ans << endl;
	}
	return 0;
}
```
TLEくらった

```
#include <iostream>
#include <algorithm>
#define mod 1000000007
using namespace std;
 
int main()
{
    int n, a[100010], ans=1;
    bool ok=true;
    cin>>n;
    for (int i=0; i<n; i++) cin>>a[i];
    sort(a, a+n);
    if (n%2==1)
    {
        if (a[0]!=0) ok=false;
        for (int i=1; i<n; i++)
        {
            if (i%2==1) { if (a[i]!=a[i-1]+2) ok=false; }
            else { if (a[i]!=a[i-1]) ok=false; }
        }
    }
    else
    {
        if (a[0]!=1 || a[1]!=1) ok=false;
        for (int i=2; i<n; i++)
        {
            if (i%2==0) { if (a[i]!=a[i-1]+2) ok=false; }
            else { if (a[i]!=a[i-1]) ok=false; }
        }
    }
    if (ok)
    {
        if (n%2==0) for (int i=0; i<n/2; i++) ans=ans*2%mod;
        else for (int i=0; i<(n-1)/2; i++) ans=ans*2%mod;
    }
    else ans=0;
    cout<<ans<<endl;
    return 0;
}
```
これで通る。
確かにソートしたほうがやりやすいな