結果
| 問題 |
No.1024 Children in a Row
|
| コンテスト | |
| ユーザー |
QCFium
|
| 提出日時 | 2020-04-17 12:12:57 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 145 ms / 2,000 ms |
| コード長 | 1,663 bytes |
| コンパイル時間 | 1,949 ms |
| コンパイル使用メモリ | 179,044 KB |
| 実行使用メモリ | 38,548 KB |
| 最終ジャッジ日時 | 2024-10-03 10:12:19 |
| 合計ジャッジ時間 | 8,300 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 27 |
ソースコード
#include <bits/stdc++.h>
int ri() {
int n;
scanf("%d", &n);
return n;
}
std::vector<std::vector<int> > childs;
std::vector<int> all;
std::vector<bool> is_recent;
std::vector<int> in, out;
void dfs(int i) {
in[i] = all.size();
if (is_recent[i]) all.push_back(i);
for (auto j : childs[i]) dfs(j);
out[i] = all.size();
}
int main() {
int n = ri();
int m = ri();
int recent[n];
std::iota(recent, recent + n, 0);
int parent[n + m];
for (auto &i : parent) i = -1;
childs.resize(n + m);
in.resize(n + m);
out.resize(n + m);
int qs[m];
int prev[m];
for (int i = 0; i < m; i++) {
int a = ri() - 1;
int b = ri() - 1;
prev[i] = recent[a];
recent[a] = n + i;
parent[n + i] = recent[b];
childs[recent[b]].push_back(n + i);
int k = ri() - 1;
qs[i] = k;
}
for (auto &i : childs) std::reverse(i.begin(), i.end());
is_recent.resize(n + m);
for (auto i : recent) is_recent[i] = true;
int real[n + m];
for (int i = 0; i < n; i++) real[recent[i]] = i;
for (int i = 0; i < n; i++) dfs(i);
std::vector<int> res;
for (auto i : all) res.push_back(real[i]);
for (int i = 0; i < m; i++) {
int insert = in[prev[i]] + is_recent[prev[i]];
int l = in[n + i];
int r = out[n + i];
int index;
if (insert < l) {
if (qs[i] < insert) index = qs[i];
else if (qs[i] < insert + r - l) index = l + qs[i] - insert;
else {
index = qs[i] - (r - l);
if (index >= l) index += r - l;
}
} else {
index = qs[i];
if (qs[i] >= l) index += r - l;
if (index >= insert) {
if (index < insert + r - l) index = l + (index - insert);
else index -= r - l;
}
}
printf("%d\n", res[index] + 1);
}
return 0;
}
QCFium