結果
| 問題 |
No.1024 Children in a Row
|
| コンテスト | |
| ユーザー |
QCFium
|
| 提出日時 | 2020-04-10 22:45:41 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 332 ms / 2,000 ms |
| コード長 | 1,799 bytes |
| コンパイル時間 | 2,126 ms |
| コンパイル使用メモリ | 180,696 KB |
| 実行使用メモリ | 50,296 KB |
| 最終ジャッジ日時 | 2024-09-15 22:52:03 |
| 合計ジャッジ時間 | 12,124 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| 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, after;
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();
std::vector<int> version[n];
for (int i = 0; i < n; i++) version[i] = { i };
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] = version[a].back();
version[a].push_back(n + i);
parent[n + i] = version[b].back();
childs[version[b].back()].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 : version) is_recent[i.back()] = true;
int real[n + m];
for (int i = 0; i < n; i++) for (auto j : version[i]) real[j] = 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];
assert(insert <= l || insert >= r);
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