問題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 括弧列
問題概要
バランスの取れた括弧列を次のように定義する:
- 空文字列はバランス括弧列
- Sがバランス括弧列なら、[S]と(S)もバランス括弧列
- 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;
}