結果
問題 | No.416 旅行会社 |
ユーザー | pekempey |
提出日時 | 2016-10-29 06:19:53 |
言語 | C++11 (gcc 11.4.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,771 bytes |
コンパイル時間 | 1,749 ms |
コンパイル使用メモリ | 163,740 KB |
実行使用メモリ | 11,120 KB |
最終ジャッジ日時 | 2024-05-03 08:44:05 |
合計ジャッジ時間 | 4,863 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 20 ms
10,540 KB |
testcase_01 | AC | 3 ms
9,680 KB |
testcase_02 | WA | - |
testcase_03 | WA | - |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | AC | 3 ms
9,684 KB |
testcase_07 | WA | - |
testcase_08 | AC | 4 ms
9,464 KB |
testcase_09 | AC | 6 ms
7,876 KB |
testcase_10 | AC | 28 ms
10,328 KB |
testcase_11 | AC | 26 ms
11,084 KB |
testcase_12 | AC | 26 ms
10,720 KB |
testcase_13 | AC | 19 ms
10,256 KB |
testcase_14 | AC | 81 ms
10,924 KB |
testcase_15 | AC | 80 ms
10,904 KB |
testcase_16 | AC | 81 ms
11,004 KB |
testcase_17 | AC | 81 ms
10,904 KB |
testcase_18 | AC | 79 ms
10,916 KB |
testcase_19 | AC | 53 ms
9,996 KB |
testcase_20 | WA | - |
ソースコード
#include <bits/stdc++.h> using namespace std; struct edge { int u, v; }; struct node { int val; node *next; }; const int N = 1e5; const int M = 2e5; int n, m, q, par[N], c[M], d[M], ans[M]; bool dead[M]; edge g[M]; node body[N], *head[N], *tail[N]; bool operator<(const edge &a, const edge &b) { return a.u != b.u ? a.u < b.u : a.v < b.v; } int find(int x) { return par[x] = (par[x] == x ? x : find(par[x])); } void unite(int x, int y, int t) { x = find(x); y = find(y); if (x == y) return; if (x > y) swap(x, y); par[y] = x; if (x == 0) { for (node *it = head[y]; it; it = it->next) ans[it->val] = t; } else { tail[x]->next = head[y]; tail[x] = tail[y]; } } #define getchar getchar_unlocked #define putchar putchar_unlocked int in() { int n, c; while ((c = getchar()) < '0') if (c == EOF) return -1; n = c - '0'; while ((c = getchar()) >= '0') n = n * 10 + c - '0'; return n; } void out(int n) { int res[11], i = 0; do { res[i++] = n % 10, n /= 10; } while (n); while (i) putchar(res[--i] + '0'); putchar('\n'); } int main() { cin >> n >> m >> q; for (int i = 0; i < n; i++) { par[i] = body[i].val = i; head[i] = tail[i] = &body[i]; } for (int i = 0; i < m; i++) g[i].u = in() - 1, g[i].v = in() - 1; sort(g, g + m); for (int i = 0; i < q; i++) { c[i] = in() - 1; d[i] = in() - 1; int k = lower_bound(g, g + m, (edge){ c[i], d[i] }) - g; if (k < m && g[k].u == c[i] && g[k].v == d[i]) dead[k] = true; } for (int i = 0; i < m; i++) if (!dead[i]) unite(g[i].u, g[i].v, -1); for (int i = q - 1; i >= 0; i--) unite(c[i], d[i], i + 1); for (int i = 1; i < n; i++) out(ans[i]); }