Yuulis.log

トンネルを抜けるとそこは参照エラーであった。

【AtCoder】ABC 342 B - Which is ahead? | 茶コーダーが解くAtCoder

atcoder.jp

実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 57

問題概要

 N 人が一列に並んでおり、前から  i 番目に並んでいる人は人  P_i である。  Q 個のクエリを処理せよ。  i 番目のクエリは以下の通り。

整数  A_i, B_i が与えられる。人  A_i と 人  B_i のうち、より前に並んでいる人の番号を出力せよ。

制約

  • 入力はすべて整数
  •  1 \leq N \leq 100
  •  1 \leq P_i \leq N
  •  P_i \neq P_j (i \neq j)
  •  1 \leq Q \leq 100
  •  1 \leq A_I \lt B_i \leq N

考察

問題文に素直に沿えば、前からの順番を添字にして人の番号を要素とする配列を作ることになる。しかし、クエリでは人の番号から前からの順番を求める必要があるので、この配列では各クエリに対して  O(n^2) がかかってしまう。今回は

具体的には、  S のある一文字  S_i について注目したとき、その他の  S の文字すべてと異なれば、その  i が求める数である ( i は1-indexed) 。

コード

#include <bits/stdc++.h>
using namespace std;

#define rep(i, start, end) for (ll i = (start); i < (ll)(end); i++)

// ======================================== //

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

    rep(i, 0, S.size())
    {
        bool flag = true;
        rep(j, 0, S.size())
        {
            if (i == j)
                continue;

            if (S[i] == S[j])
                flag = false;
        }

        if (flag)
        {
            cout << i + 1 << endl;
            return 0;
        }
    }
}

atcoder.jp

実装時間: 5分