AtCoder Beginner Contest 323

## [A - Weak Beats](https://atcoder.jp/contests/abc323/tasks/abc323_a)

ループと偶数を判定する問題です。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    string s;
    cin >> s;

    for(int i=1; i<s.size(); i+=2){
        if(s[i] != '0'){
            cout << "No" << endl;
            return 0;
        }
    }

    cout << "Yes" << endl;
    return 0;
} 
```

## [B - Round-Robin Tournament](https://atcoder.jp/contests/abc323/tasks/abc323_b)

ソート、ラムダ式の問題です。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<int,int>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    int N;
    cin >> N;
    vector<string> S(N);
    rep(i, N) cin >> S[i];

    vector<P> p(N);
    rep(i, N){
        int success = 0;
        rep(j, N) if(S[i][j] == 'o') success++;
        
        p[i].first = success;
        p[i].second = i+1;
    }

    //sort
    sort(p.begin(), p.end(), [](P const& x, P const& y){
        return x.first == y.first? x.second < y.second: x.first > y.first;
    });

    rep(i, N){
        cout << p[i].second << ' ';
    }

    return 0;
} 
```

## [C - World Tour Finals](https://atcoder.jp/contests/abc323/tasks/abc323_c)

ソートとデータ構造の実装問題です。
下記３点に注意して実装します。
- 事前に解答している問題は再度加点できない。
- 各問題の配点の高い順にインデックスを保持した状態でソートする。
- プレイヤー番号の番号の分だけ加点を行う

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<ll,ll>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    ll N, M;
    cin >> N >> M;

    vector<P> A(M);
    rep(i, M){
        int a;
        cin >> a;
        A[i].first = a;
        A[i].second = i;
    }

    vector<string> S(N);
    rep(i, N) cin >> S[i];

    ll total = 0;
    vector<ll> point(N, 0);
    rep(i, N){ 
        rep(j, M) if(S[i][j] == 'o') point[i] += A[j].first;
        point[i] += i + 1;
        total += point[i];
    }

        //sort
    sort(A.begin(), A.end(), [](P const& x, P const& y){
        return x.first == y.first? x.second < y.second: x.first > y.first;
    });

    rep(i, N){
        ll top = 0;
        rep(k, N) if(i!=k) top = max(top, point[k]);

        if(top < point[i]){
            cout << 0 << endl;
            continue;
        }

        ll p = point[i];
        ll cnt = 0;
        rep(j, M){
            if(S[i][A[j].second] == 'x'){
                p += A[j].first;
                cnt++;
            }
            if(top <= p){
                cout << cnt << endl;
                break;
            }
        }
    }

    return 0;
} 
```

## [D - Merge Slimes](https://atcoder.jp/contests/abc323/tasks/abc323_d)

貪欲法とデータ構造の問題です。
小さいサイズから順に処理を行っていくと解答をできます。
mapかプライオリティキューの問題です。

```C++:C++
#include <bits/stdc++.h>
 
#define rep(i,n) for(int i=0; i<(n); ++i)
#define repx(i,x,n) for(int i=x; i<(n); ++i)
#define fixed_setprecision(n) fixed << setprecision((n))
#define execution_time(ti) printf("Execution Time: %.4lf sec\n", 1.0 * (clock() - ti) / CLOCKS_PER_SEC);
#define pai 3.1415926535897932384
#define NUM_MAX 2e18
#define NUM_MIN -1e9
 
using namespace std;
using ll = long long;
using P = pair<ll,ll>;
template<class T> inline bool chmax(T& a, T b){ if(a<b){ a=b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b){ if(a>b){ a=b; return 1; } return 0; }

int main() {
    ll N;
    cin >> N;

    ll total = 0;
    map<ll, ll> mp;
    rep(i, N){
        ll s, c;
        cin >> s >> c;
        mp[s] = c;
        total += c;
    }

    for(auto& m:mp){
        ll size = m.first;
        ll add = m.second / 2;
        mp[size*2] += add;
        total -= add*2;
        total += add;
    }
    cout << total << endl;

    return 0;
} 
```