AtCoder 勉強記録[C++] その56

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
## A - Election 2
[A - Election 2](https://atcoder.jp/contests/abc366/tasks/abc366_a)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mod 998244353

int main() {
  ll n, t, a;
  cin >> n >> t >> a;
  ll dif = abs(t - a);
  ll sum = t + a;
  if(n - sum < dif) cout << "Yes" << endl;
  else cout << "No" << endl;
}
```
### 解法
`T`と`A`の合計と`N`の差よりも`T`と`A`の差のほうが大きい場合、勝利が確定する。
## A - Shout Everyday
[A - Shout Everyday](https://atcoder.jp/contests/abc367/tasks/abc367_a)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mod 998244353

int main() {
  ll a, b, c;
  cin >> a >> b >> c;
  if(b < c) {
    if(b < a && a < c) cout << "No" << endl;
    else cout << "Yes" << endl;
  } else {
    if(c < a && a < b) cout << "Yes" << endl;
    else cout << "No" << endl;
  }
}
```
### 解法
日付をまたがない場合は`B<A<C`の場合は叫ぶことができなく、それ以外の場合に叫ぶ。日付をまたぐ場合は`C<A<B`の場合に叫ぶことができ、それ以外の場合は叫ぶことができない。
## B - Vertical Writing
[B - Vertical Writing](https://atcoder.jp/contests/abc366/tasks/abc366_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mod 998244353

int main() {
  ll n;
  cin >> n;
  vector<string> s(n);
  ll m = 0;
  rep(i, n) {
    cin >> s[i];
    ll tmp = s[i].size();
    m = max(tmp, m);
  }
  vector<string> t(m, string(n, '*'));
  reverse(s.begin(), s.end());
  ll next;
  for(int i = 0; i < n; i++){
    ll now = s[i].size();
    for(int j = 0; j < now; j++){
      t[j][i] = s[i][j];
    }
  }
  for(int i = 0; i < m; i++) {
    while(t[i].back()=='*') t[i].pop_back();
  }
  for(auto x : t) cout << x << endl;
}
```
### 解法
`M×N`の`*`で構成された文字列配列`T`を用意する。`T`の文字を`S`の文字列を縦にしたものに変えていき、`T`の要素のうち、末尾が`*`の物の末尾を削除する。
## B - Cut .0
[B - Cut .0](https://atcoder.jp/contests/abc367/tasks/abc367_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mod 998244353

int main() {
  string x;
  cin >> x;
  while(x.back()=='0') {
    x.pop_back();
  } 
  if(x.back()=='.') x.pop_back();
  cout << x << endl;
}
```
### 解法
`x`を文字列として入力を受け取り、末尾が0の場合末尾を削除していく。最後に末尾が小数点だった場合それも削除する。
## C - Balls and Bag Query
[C - Balls and Bag Query](https://atcoder.jp/contests/abc366/tasks/abc366_c)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define mod 998244353

int main() {
  ll q;
  cin >> q;
  map<ll, ll> bag;
  for(int i = 0; i < q; i++){
    ll n, x;
    cin >> n;
    if(n == 1) {
      cin >> x;
      bag[x]++;
    } else if(n == 2) {
      cin >> x;
      bag[x]--;
      if(bag[x]==0) bag.erase(x);
    } else {
      cout << bag.size() << endl;
    }
  }
}
```
### 解法
ボールを入れる袋であるMapを用意する。クエリごとにボールを入れる処理、出す処理、出力を行う。出す処理を行う際に要素が0となった場合、その要素を削除する。