Atcoder Beginner Contest 402

問題一覧

  • A問題
  • B問題
  • C問題
  • D問題
  • 結果

    AC:3,WA:3,CE:2,RE:1

    レート変化:-25 656

    それでは解説です

    A問題

    6:34 AC,WA:1

    大文字の判定は,issupper関数を使います

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
      string s;
      cin >> s;
    
      for (char c : s)
      {
        if (isupper(c))
        {
          cout << c;
        }
      }
    
      cout << endl;
      return 0;
    }

    B問題

    29:32 AC,WA:2

    queueに入れて、取り出せばOKです。

    #include <bits/stdc++.h>
    using namespace std;
    
    int main()
    {
      int a;
      cin >> a;
    
      queue q;
      for (int i = 0; i < a; i++)
      {
        int op;
        cin >> op;
    
        if (op == 1)
        {
          int m;
          cin >> m;
          q.push(m);
        }
        else if (op == 2)
        {
          if (!q.empty())
          {
            cout << q.front() << endl;
            q.pop();
          }
        }
      }
    
      return 0;
    } 

    C問題

    96:54 AC,WA:1

    嫌いなものの個数を数えます。

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
      int a, b;
      cin >> a >> b;
      unordered_map<int, vector<int>> id_to_event;
    
      int n, m;
      for (int i = 0; i < b; i++)
      {
        cin >> n;
        for (int j = 0; j < n; j++)
        {
          cin >> m;
          id_to_event[m].push_back(i);
        }
      }
    
      vector bat(a);
      vector last_seen_event(b, 0);
      vector day(a + 1, 0);
    
      for (int i = 0; i < a; i++)
      {
        cin >> bat[i];
        if (id_to_event.count(bat[i]))
        {
          for (int j : id_to_event[bat[i]])
          {
            last_seen_event[j] = i;
          }
        }
      }
      for (int i = 0; i < b; i++)
      {
        day[last_seen_event[i]]++;
      }
    
      int cnt = 0;
      for (int i = 0; i < a; i++)
      {
        cout << cnt + day[i] << endl;
        cnt += day[i];
      }
    
      return 0;
    }

    D問題

    コンテスト中は書き終わりませんでした、が5分で解けます(A問題より簡単です)。

    全ての直線の組み合わせnP2から平行な直線全ての組み合わせを引けばよいです。

    平行な直線はmodで判定できます。

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
      int a, b;
      cin >> a >> b;
      vector Line(a, 0);
      int n, m;
      for (int i = 0; i < b; i++)
      {
        cin >> n >> m;
        Line[(n + m) % a]++;
      }
      long long cnt = (long long)b * (b - 1) / 2;
      for (auto i : Line)
      {
        cnt -= i * (i - 1) / 2;
      }
      cout << cnt << endl;
      return 0;
    }

    反省

    PCの充電がなくなり3回ほどシャットダウンされてしまいました。

    そのため、スマホのターミナルで解こうとしましたがことごとく失敗しました。

    また、D問題から解くべきでした。

    過去問のC埋めを続けて行きます。

    2025/04/19