ABC329 参加記(ABCD+F)


https://atcoder.jp/contests/abc329

https://atcoder.jp/users/x__0/history/share/abc329

ABCD四完+(終了後のおまけF)です。

一応温まりました。

# A - Spread

https://atcoder.jp/contests/abc329/tasks/abc329_a

やるだけ

最後の空白に注意

```cpp:abc329_a.cpp
#include<bits/stdc++.h>
using namespace std;

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

    for(int i = 0; i < S.size(); ++i)
    {
        cout << S[i] << (i != S.size() - 1 ? " " : "\n");
    }

    return 0;
}
```

https://atcoder.jp/contests/abc329/submissions/47672433

# B - Next

https://atcoder.jp/contests/abc329/tasks/abc329_b

`std::set`で全部管理して、最大値を消した後にもう一度最大値を取得する

```cpp:abc329_b.cpp
#include<bits/stdc++.h>
using namespace std;

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

    set<int> dat;
    for (int i = 0; i < N; ++i){
        int A;
        cin >> A;

        dat.emplace(A);
    }

    dat.erase(*dat.rbegin());

    cout << *dat.rbegin() << endl;

    return 0;
}
```

https://atcoder.jp/contests/abc329/submissions/47676582

# C - Count xxx

https://atcoder.jp/contests/abc329/tasks/abc329_c

文字が最大で何個連続してるかを`std::map`で管理して、その全ての値の合計が答え。

`cnt`の初期値が1なのと、最後の文字は勝手に処理されないことに注意


```cpp:abc329_c.cpp
#include<bits/stdc++.h>
using namespace std;

int main(){
    int N;
    string S;
    cin >> N >> S;

    map<char, int> dat;
    char mae = S[0];
    int cnt = 1;

    for (int i = 1; i < N; ++i){
        if(S[i]!=mae){
            dat[mae] = max(dat[mae], cnt);
            cnt = 1;
        }else{
            cnt++;
        }
        mae = S[i];
    }

    dat[mae]=max(dat[mae], cnt);

    int ans = 0;
    for(auto x:dat){
        ans += x.second;
    }

    cout << ans << endl;

    return 0;
}
```

https://atcoder.jp/contests/abc329/submissions/47688364

# D - Election Quick Report

https://atcoder.jp/contests/abc329/tasks/abc329_d

「$i$票目時点で一番票がある人」を管理すればok

自分は`std::pair`で管理した

```cpp:abc329_d.cpp
#include<bits/stdc++.h>
using namespace std;

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

    vector<int> dat(N, 0);
    pair<int, int> tmp;

    for (int i = 0; i < M; ++i){
        int A;
        cin >> A;

        A--;
        dat[A]++;

        if (dat[A] > tmp.second || (dat[A] == tmp.second && A < tmp.first))
        {
            tmp.first = A;
            tmp.second = dat[A];
        }

        cout << tmp.first + 1 << endl;
    }

    return 0;
}
```

https://atcoder.jp/contests/abc329/submissions/47693742

# F - Colored Ball

https://atcoder.jp/contests/abc329/tasks/abc329_f

解説AC。ちょっと変えれば動いて悔しい

~~マージテクって何だよ~~

```cpp:abc329_f.cpp
#include<bits/stdc++.h>
using namespace std;

int main(){
    int N,Q;
    cin>>N>>Q;

    vector<int> C(N);
    for (int i = 0; i < N; ++i){
        cin >> C[i];
    }

    vector<set<int>> dat(N);
    for(int i = 0; i < N; ++i){
        dat[i].emplace(C[i]);
    }

    while(Q--){
        int a,b;
        cin >> a >> b;

        a--;
        b--;

        if(dat[a].size()<dat[b].size()){
            dat[b].merge(dat[a]);
            dat[a].clear();
        }
        else{
            dat[a].merge(dat[b]);
            dat[b].clear();
            swap(dat[a],dat[b]);
        }

        cout << dat[b].size() << endl;
    }

    return 0;
}
```

https://atcoder.jp/contests/abc329/submissions/47732470

# 今日の教訓

**マージは小さい方から大きい方に向かってやれ。**