at coder beginner 036

B
N×N のマス目があります。 各マスには o または x という文字が書かれています。 上から i 番目、左から j 番目に書かれている文字は si,j です。 このマス目を時計回りに 90 度回転してください。 

似たようなやつを昔にやったな

高橋君は 4 x 4 マスの盤面を見つけました。
各マスには .ox のいずれかの文字が書かれています。
彼はこの盤面を回転させた後、どういった状態になるのか気になりました。
盤面を正面から見たときの状態が与えられるので、180 度回転させた後の盤面を出力してください。 

```
#include<iostream>
using namespace std;

int main() {
    char c[4][4];
    char copy[4][4];
    for (int i = 0; i < 4; ++i) {
        for (int j = 0; j < 4; ++j) {
            cin >> c[i][j];
        }
    }
    for (int i = 0; i < 4; ++i) {
        for (int j = 0; j < 4; ++j) {
            copy[i][j] = c[3 - i][3 - j];
        }
    }
    for (int i = 0; i < 4; ++i) {
        for (int j = 0; j < 4; ++j) {
            cout << copy[i][j]<<" ";
        }
        cout << endl;
    }
    return 0;
}
```
これ。180°だとこうなるけど90°のときはどうなるって話か

```
#include<iostream>
using namespace std;
int main() {
	int N;
	cin >> N;
	char s[51][51];
	char copy[51][51];
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < N; ++j) {
			cin >> s[i][j];
		}
	}
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < N; ++j) {
			if (i < N / 2 && j < N / 2) {
				copy[i][j] = s[N - 1 - i][j];
			}
			else if (i < N / 2 && j >= N / 2) {
				copy[i][j] = s[i][N - 1 - j];
			}
			else if (i >= N / 2 && j < N / 2) {
				copy[i][j] = s[i][N - 1 - j];
			}
			else if (i >= N / 2 && j >= N / 2) {
				copy[i][j] = s[N - 1 - i][j];
			}
			else {
				copy[i][j] = s[i][j];
			}
		}
	}
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < N; ++j) {
			cout << copy[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}
```
こんなかんじでごたごたやってたけどなかなか答えが合わない、、

```
#include <iostream>
using namespace std;
 
int main()
{
    int n;
    cin >> n;
    char s[n][n];
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            cin >> s[i][j];
 
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            cout << s[n-j-1][i];
        }
        cout << endl;
    }
 
    return 0;
}
```
こたえをみた。いや頭いいな。算数だなこれは、うーん頭が悪い、、

C
N 人の人が座っています。 i 番目の人の座圧は ai です。 すぬけ君は、大小関係を保存したまま座圧のデータを圧縮して保存することにしました。 以下の条件を満たす数列 b1,…,bN を求めてください。 
bi はすべて非負整数である。
ai<aj ならば bi<bj である。
ai=aj ならば bi=bj である。
上の条件を満たす配列のうち、bi の最大値が最小となる。
このような条件をみたす b は一意に定まることが知られています。 
制約
1≤N≤105
0≤ai≤109
ai は整数である。

```#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<list>
#include<cmath>
#include<map>
using namespace std;
using ll = long long;
const int INF = 1e9;
#define rep(i,n)for(int i=0;i<n;++i)
#define p pair<int,int>
int main() {
	int N;
	cin >> N;
	vector<ll>a(N);
	for (int i = 0; i < N; ++i) {
		cin >> a[i];
	}
	vector<ll>b(N);
	for (int i = 0; i < N; ++i) {
		b[i] = a[i];
	}
	sort(b.begin(), b.end());
	b.erase(unique(b.begin(), b.end()), b.end());
	vector<ll>number(N);
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < b.size(); ++j) {
			if (a[i] == b[j]) {
				number[i] = j;
			}
		}
	}
	for (int i = 0; i < N; ++i) {
		cout << number[i] << endl;
	}
	return 0;
}
```
TLE

高速にするにはmapを使う

```#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<list>
#include<cmath>
#include<map>
using namespace std;
using ll = long long;
const int INF = 1e9;
#define rep(i,n)for(int i=0;i<n;++i)
#define p pair<int,int>
int main() {
	int N; cin >> N;
	vector<pair<int, int>>a;
	for (int i = 0; i < N; ++i) {
		int t;
		cin >> t;
		a.push_back(make_pair(t, i));
	}
	sort(a.begin(), a.end());
	vector<int>b(N);
	b[0] = 0;
	for (int i = 1; i < N; ++i) {
		if (a[i].first > a[i - 1].first) {
			b[i] += b[i - 1] + 1;
		}
		else {
			b[i] = b[i - 1];
		}
	}
	vector<int>ans(N);
	for (int i = 0; i < N; ++i) {
		ans[a[i].second] = b[i];
	}
	for (int i = 0; i < N; ++i) {
		cout << ans[i] << endl;
	}
	return 0;
}
```

```