結果
問題 | No.2290 UnUnion Find |
ユーザー | Daylight |
提出日時 | 2023-05-05 22:28:02 |
言語 | D (dmd 2.106.1) |
結果 |
AC
|
実行時間 | 469 ms / 2,000 ms |
コード長 | 5,646 bytes |
コンパイル時間 | 5,346 ms |
コンパイル使用メモリ | 236,808 KB |
実行使用メモリ | 36,908 KB |
最終ジャッジ日時 | 2023-09-04 20:14:47 |
合計ジャッジ時間 | 29,341 ms |
ジャッジサーバーID (参考情報) |
judge14 / judge11 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
4,384 KB |
testcase_01 | AC | 2 ms
4,384 KB |
testcase_02 | AC | 187 ms
4,448 KB |
testcase_03 | AC | 278 ms
22,932 KB |
testcase_04 | AC | 287 ms
22,900 KB |
testcase_05 | AC | 284 ms
23,020 KB |
testcase_06 | AC | 292 ms
22,944 KB |
testcase_07 | AC | 289 ms
22,944 KB |
testcase_08 | AC | 281 ms
22,976 KB |
testcase_09 | AC | 299 ms
22,884 KB |
testcase_10 | AC | 284 ms
22,784 KB |
testcase_11 | AC | 283 ms
22,916 KB |
testcase_12 | AC | 282 ms
22,808 KB |
testcase_13 | AC | 285 ms
22,916 KB |
testcase_14 | AC | 287 ms
22,784 KB |
testcase_15 | AC | 282 ms
22,956 KB |
testcase_16 | AC | 279 ms
22,788 KB |
testcase_17 | AC | 275 ms
22,956 KB |
testcase_18 | AC | 281 ms
22,936 KB |
testcase_19 | AC | 343 ms
23,024 KB |
testcase_20 | AC | 469 ms
36,908 KB |
testcase_21 | AC | 202 ms
4,588 KB |
testcase_22 | AC | 257 ms
12,160 KB |
testcase_23 | AC | 259 ms
12,164 KB |
testcase_24 | AC | 395 ms
22,920 KB |
testcase_25 | AC | 236 ms
12,168 KB |
testcase_26 | AC | 421 ms
23,220 KB |
testcase_27 | AC | 401 ms
23,024 KB |
testcase_28 | AC | 314 ms
12,116 KB |
testcase_29 | AC | 379 ms
22,984 KB |
testcase_30 | AC | 216 ms
11,860 KB |
testcase_31 | AC | 359 ms
22,904 KB |
testcase_32 | AC | 244 ms
11,924 KB |
testcase_33 | AC | 309 ms
12,092 KB |
testcase_34 | AC | 422 ms
36,908 KB |
testcase_35 | AC | 423 ms
23,252 KB |
testcase_36 | AC | 245 ms
12,120 KB |
testcase_37 | AC | 287 ms
12,076 KB |
testcase_38 | AC | 244 ms
11,976 KB |
testcase_39 | AC | 263 ms
12,204 KB |
testcase_40 | AC | 407 ms
23,228 KB |
testcase_41 | AC | 233 ms
12,072 KB |
testcase_42 | AC | 348 ms
22,828 KB |
testcase_43 | AC | 330 ms
22,896 KB |
testcase_44 | AC | 287 ms
22,936 KB |
testcase_45 | AC | 311 ms
22,952 KB |
testcase_46 | AC | 320 ms
22,920 KB |
ソースコード
public import std; DList!string scan_buffer; DList!char char_buffer; static this() { scan_buffer = DList!(string)(); char_buffer = DList!(char)(); } void cin()() { } void cin(T, A...)(ref T a, ref A tail) { import std.traits : isArray; static if (typeof(a).stringof == "string") { if (!char_buffer.empty) { a = char_buffer.array.map!(x => x.to!string).join(); char_buffer.clear(); } else { while (scan_buffer.empty) { foreach (t; readln.split) { if (t.length == 0) { continue; } scan_buffer.insert(t); } } auto token = scan_buffer.front; scan_buffer.removeFront(); a = token; } } else static if (typeof(a).stringof == "char") { if (!char_buffer.empty) { a = char_buffer.front(); char_buffer.removeFront(); } else { while (scan_buffer.empty) { foreach (t; readln.split) { if (t.length == 0) { continue; } scan_buffer.insert(t); } } auto token = scan_buffer.front; scan_buffer.removeFront(); a = token[0]; if (token.length > 1) { foreach (c; token[1 .. $]) { char_buffer.insertBack(c); } } } } else static if (typeof(a).stringof == "char[]") { if (a.length == 0) { string token; cin(token); foreach (c; token) { a ~= c; } } else { foreach (ref v; a) { cin(v); } } } else static if (isArray!(typeof(a))) { foreach (ref v; a) { cin(v); } } else static if (isTuple!(typeof(a))) { foreach (i, _; a) { cin(a[i]); } } else { if (!char_buffer.empty) { writeln(char_buffer.array.map!(x => x.to!string)); a = char_buffer.array.map!(x => x.to!string).join().to!T; char_buffer.clear(); } else { while (scan_buffer.empty) { foreach (t; readln.split) { if (t.length == 0) { continue; } scan_buffer.insert(t); } } auto token = scan_buffer.front; scan_buffer.removeFront(); a = token.to!T; } } cin(tail); } bool chmin(T)(ref T a, T b) { if (a > b) { a = b; return true; } return false; } bool chmax(T)(ref T a, T b) { if (a < b) { a = b; return true; } return false; } alias PQueue(T = long, alias less = "a<b") = BinaryHeap!(Array!T, less); class Dsu { public: this(long n) @safe nothrow { _n = cast(int) n, parent_or_size = new int[](n); parent_or_size[] = -1; } int merge(long a, long b) @safe nothrow @nogc { assert(0 <= a && a < _n); assert(0 <= b && b < _n); int x = leader(a), y = leader(b); if (x == y) return x; if (-parent_or_size[x] < -parent_or_size[y]) { auto tmp = x; x = y; y = tmp; } parent_or_size[x] += parent_or_size[y]; parent_or_size[y] = x; return x; } bool same(long a, long b) @safe nothrow @nogc { assert(0 <= a && a < _n); assert(0 <= b && b < _n); return leader(a) == leader(b); } int leader(long a) @safe nothrow @nogc { assert(0 <= a && a < _n); if (parent_or_size[a] < 0) return cast(int) a; return parent_or_size[a] = leader(parent_or_size[a]); } int size(long a) @safe nothrow @nogc { assert(0 <= a && a < _n); return -parent_or_size[leader(a)]; } int[][] groups() @safe nothrow { auto leader_buf = new int[](_n), group_size = new int[](_n); foreach (i; 0 .. _n) { leader_buf[i] = leader(i); group_size[leader_buf[i]]++; } auto result = new int[][](_n); foreach (i; 0 .. _n) result[i].reserve(group_size[i]); foreach (i; 0 .. _n) result[leader_buf[i]] ~= i; int[][] filtered; foreach (r; result) if (r.length != 0) filtered ~= r; return filtered; } private: int _n; int[] parent_or_size; } void main() { int N, Q; cin(N, Q); auto dsu = new Dsu(N); auto set = new RedBlackTree!long(); foreach (i; 0 .. N) { set.insert(i); } foreach (q; 0 .. Q) { int k; cin(k); if (k == 1) { int u, v; cin(u, v); u--; v--; if (dsu.same(u, v)) continue; int G = dsu.leader(u) ^ dsu.leader(v); G ^= dsu.merge(u, v); set.removeKey(G); } else { int v; cin(v); v--; v = dsu.leader(v); auto it = set.upperBound(v); if (!it.empty()) { (it.front() + 1).writeln; } else { it = set.lowerBound(v); if (it.empty()) { writeln(-1); } else { (it.front() + 1).writeln; } } } } }