結果
| 問題 | No.1778 括弧列クエリ / Bracketed Sequence Query |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-12-24 13:14:47 |
| 言語 | D (dmd 2.109.1) |
| 結果 |
AC
|
| 実行時間 | 299 ms / 2,000 ms |
| コード長 | 1,441 bytes |
| コンパイル時間 | 2,978 ms |
| コンパイル使用メモリ | 254,376 KB |
| 実行使用メモリ | 21,968 KB |
| 最終ジャッジ日時 | 2024-06-22 13:53:14 |
| 合計ジャッジ時間 | 11,267 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 27 |
ソースコード
import std;
void main(){
auto input = readln.chomp.split(" ");
int N = input[0].to!int;
int Q = input[1].to!int;
auto S = readln.chomp;
int[] a = new int[N + 1];
int[] parent = new int[N + 1];
int node = 0;
for(auto i = 1; i <= N; i++){
if(S[i - 1]=='('){
parent[i] = node;
node = i;
}else{
a[node] = i;
a[i] = node;
parent[i] = parent[node];
node = parent[node];
}
}
int[][] dbl;
dbl ~= new int[N + 1];
auto depth = new int[N + 1];
for(auto i = 1; i <= N; i++){
depth[i] = depth[parent[i]] + 1;
dbl[0][i] = parent[i];
}
auto max_depth = depth.maxElement;
for(auto k = 1; k < max_depth; k *= 2){
dbl ~= new int[N + 1];
for(auto i = 1; i <= N; i++){
dbl[$ - 1][i] = dbl[$ - 2][dbl[$ - 2][i]];
}
}
for(auto q = 0; q < Q; q++){
input = readln.chomp.split(" ");
int x = input[0].to!int;
int y = input[1].to!int;
if(depth[x] < depth[y]){
auto t = x;
x = y;
y = t;
}
auto d = depth[x] - depth[y];
auto k = 0;
while(d > 0){
if(d & 1){
x = dbl[k][x];
}
k++;
d >>= 1;
}
//stderr.writeln([x,y]);
if(x == a[y] || x == y){
writefln("%d %d", min(x, a[x]), max(x, a[x]));
continue;
}
for(k = cast(int)dbl.length - 1; k >= 0; k--){
if(dbl[k][x] != dbl[k][y]){
x = dbl[k][x];
y = dbl[k][y];
}
}
//stderr.writeln(">",[x,y]);
if(parent[x] > 0){
writefln("%d %d", parent[x], a[parent[x]]);
}else{
writeln(-1);
}
}
}