データ構造:線形リスト

問題3156 【基礎15.例題1】生徒番号の照会

問題概要

最大2×106人の生徒が教室に入っており、それぞれの生徒番号(1〜109の範囲)が教室に入った順序で与えられる。その後、最大105回にわたって、何番目に教室に入ったかを尋ねる質問が行われる。各質問に対する答えを出力する必要がある。

入力形式

n m s1 s2 ... sn q1 q2 ... qm

nは生徒数、mは質問の回数を表す。siはi番目に教室に入った生徒の学籍番号、qjは質問された順序を示す。

出力形式

各質問に対する生徒番号を改行区切りで出力する。

サンプル入力

10 3 1 9 2 60 8 17 11 4 5 14 1 5 9

サンプル出力

1 8 5

C++による実装例

#include <iostream>
using namespace std;

int main() {
    int totalStudents, queryCount;
    int studentId[2000001];

    cin >> totalStudents >> queryCount;

    for(int i = 1; i <= totalStudents; i++) {
        cin >> studentId[i];
    }

    for(int q = 0; q < queryCount; q++) {
        int position;
        cin >> position;
        cout << studentId[position] << endl;
    }

    return 0;
}

問題1241 括弧列

問題概要

バランスの取れた括弧列を次のように定義する:

  1. 空文字列はバランス括弧列
  2. Sがバランス括弧列なら、[S]と(S)もバランス括弧列
  3. AとBがともにバランス括弧列なら、AB(連結)もバランス括弧列

入力として与えられる括弧列sに対して、未ペアの括弧を補完してバランス括弧列にする必要がある。

入力形式

1つの文字列s('(', ')', '[', ']'のみから構成される)

出力形式

バランスの取れた括弧列を出力する

サンプル入力1

([()

サンプル出力1

()

サンプル入力2

([)

サンプル出力2

()

C++による実装例

#include <iostream>
#include <string>
using namespace std;

int bracketStatus[100010];

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

    for(int i = 0; i < input.length(); i++) {
        if(input[i] == ')') {
            for(int j = i - 1; j >= 0; j--) {
                if(input[j] == '(' && bracketStatus[j] == 0) {
                    bracketStatus[i] = bracketStatus[j] = 1;
                    break;
                }
                else if(input[j] == '[' && bracketStatus[j] == 0) {
                    break;
                }
            }
        }
        else if(input[i] == ']') {
            for(int j = i - 1; j >= 0; j--) {
                if(input[j] == '[' && bracketStatus[j] == 0) {
                    bracketStatus[i] = bracketStatus[j] = 1;
                    break;
                }
                else if(input[j] == '(' && bracketStatus[j] == 0) {
                    break;
                }
            }
        }
    }

    for(int i = 0; i < input.length(); i++) {
        if(bracketStatus[i] == 0) {
            if(input[i] == '(' || input[i] == ')') {
                cout << "()";
            } else {
                cout << "[]";
            }
        } else {
            cout << input[i];
        }
    }

    return 0;
}

タグ: C++ アルゴリズム データ構造 配列 スタック

6月8日 22:54 投稿