Submission #18198611
Source Code Expand
Copy
#include <iostream> #include <string> #include <cmath> #include<algorithm> #include<stack> #include<queue> #include<map> #include<set> #include<iomanip> #include<bitset> #define _USE_MATH_DEFINES #include <math.h> #include <functional> #include<complex> #include<cassert> #include<random> using namespace std; #include<atcoder/all> using namespace atcoder; #define rep(i,x) for(ll i=0;i<x;i++) #define repn(i,x) for(ll i=1;i<=x;i++) typedef long long ll; const ll INF = 1e17; const ll MAX = 4000001; const long double eps = 1E-14; ll max(ll a, ll b) { if (a > b) { return a; } return b; } ll min(ll a, ll b) { if (a > b) { return b; } return a; } ll gcd(ll a, ll b) { if (b == 0) { return a; } if (a < b) { return gcd(b, a); } return gcd(b, a % b); } ll lcm(ll a, ll b) { return a / gcd(a, b) * b; } struct edge { ll ind; ll fr; ll to; ll d; }; using mint = modint; typedef vector<ll> vll; typedef vector<vector<ll>> vvll; typedef vector<vector<vector<ll>>> vvvll; typedef vector<mint> vmint; typedef vector<vector<mint>> vvmint; typedef vector<vector<vector<mint>>> vvvmint; vmint f, finv, inv; void cominit(ll N) { ll MOD = modint::mod();//デフォルトが998244353に注意 f.assign(N + 1, 1); finv.assign(N + 1, 1); inv.assign(N + 1, 1); inv[1] = 1; repn(i, N) { f[i] = f[i - 1] * i; if (i > 1)inv[i] = -inv[MOD % i] * (MOD / i); finv[i] = finv[i - 1] * inv[i]; } } mint com(ll a, ll b) { if (a < 0 || b < 0 || a < b) { return 0; } return f[a] * finv[b] * finv[a - b]; } ///////////////////////////////////// int main() { ll N, M; cin >> N >> M; dsu d(N + 1); vll par(N + M + 1); vll rt(N + 1); repn(i, N + M)par[i] = i; repn(i, N)rt[i] = i; repn(i, M) { ll a, b; cin >> a >> b; a = d.leader(a); b = d.leader(b); if (a == b) { continue; } par[rt[a]] = N + i; par[rt[b]] = N + i; d.merge(a, b); rt[d.leader(a)] = N + i; } vll ht(N + M + 1,0); for (ll i = N + M; i >= 1; i--) { ht[i] = ht[par[i]] + 1; } vvll dob(20, vll(N + M + 1, 0)); repn(i, N + M)dob[0][i] = par[i]; repn(j, 19)repn(i, N + M) { dob[j][i] = dob[j - 1][dob[j - 1][i]]; } ll Q; cin >> Q; repn(q, Q) { ll x, y; cin >> x >> y; if (ht[x] < ht[y]) { swap(x, y); } ll dif = ht[x] - ht[y]; rep(k, 20) { if ((dif >> k) & 1) { x = dob[k][x]; } } if (x == y) { cout << x - N << endl; continue; } for (ll k = 19; k >= 0; k--) { if (dob[k][x] != dob[k][y]) { x = dob[k][x]; y = dob[k][y]; } } if (par[x] != par[y]) { cout << -1 << endl; } else { cout << par[x]-N << endl; } } }
Submission Info
Submission Time | |
---|---|
Task | H - Union Sets |
User | dokin |
Language | C++ (GCC 9.2.1) |
Score | 600 |
Code Size | 2736 Byte |
Status | AC |
Exec Time | 382 ms |
Memory | 40508 KB |
Judge Result
Set Name | Sample | All | ||||
---|---|---|---|---|---|---|
Score / Max Score | 0 / 0 | 600 / 600 | ||||
Status |
|
|
Set Name | Test Cases |
---|---|
Sample | sample_01.txt, sample_02.txt, sample_03.txt |
All | sample_01.txt, sample_02.txt, sample_03.txt, subtask_1_1.txt, subtask_1_10.txt, subtask_1_11.txt, subtask_1_12.txt, subtask_1_13.txt, subtask_1_14.txt, subtask_1_15.txt, subtask_1_16.txt, subtask_1_17.txt, subtask_1_18.txt, subtask_1_19.txt, subtask_1_2.txt, subtask_1_20.txt, subtask_1_21.txt, subtask_1_22.txt, subtask_1_23.txt, subtask_1_24.txt, subtask_1_25.txt, subtask_1_26.txt, subtask_1_27.txt, subtask_1_28.txt, subtask_1_29.txt, subtask_1_3.txt, subtask_1_30.txt, subtask_1_31.txt, subtask_1_32.txt, subtask_1_33.txt, subtask_1_34.txt, subtask_1_35.txt, subtask_1_36.txt, subtask_1_37.txt, subtask_1_38.txt, subtask_1_39.txt, subtask_1_4.txt, subtask_1_40.txt, subtask_1_41.txt, subtask_1_42.txt, subtask_1_43.txt, subtask_1_44.txt, subtask_1_45.txt, subtask_1_46.txt, subtask_1_5.txt, subtask_1_6.txt, subtask_1_7.txt, subtask_1_8.txt, subtask_1_9.txt |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
sample_01.txt | AC | 9 ms | 3584 KB |
sample_02.txt | AC | 2 ms | 3624 KB |
sample_03.txt | AC | 2 ms | 3576 KB |
subtask_1_1.txt | AC | 2 ms | 3500 KB |
subtask_1_10.txt | AC | 38 ms | 13696 KB |
subtask_1_11.txt | AC | 158 ms | 19708 KB |
subtask_1_12.txt | AC | 17 ms | 12744 KB |
subtask_1_13.txt | AC | 8 ms | 4296 KB |
subtask_1_14.txt | AC | 3 ms | 3636 KB |
subtask_1_15.txt | AC | 63 ms | 3744 KB |
subtask_1_16.txt | AC | 12 ms | 4344 KB |
subtask_1_17.txt | AC | 26 ms | 3784 KB |
subtask_1_18.txt | AC | 3 ms | 3544 KB |
subtask_1_19.txt | AC | 25 ms | 12024 KB |
subtask_1_2.txt | AC | 2 ms | 3596 KB |
subtask_1_20.txt | AC | 4 ms | 3752 KB |
subtask_1_21.txt | AC | 24 ms | 3616 KB |
subtask_1_22.txt | AC | 13 ms | 8316 KB |
subtask_1_23.txt | AC | 363 ms | 22456 KB |
subtask_1_24.txt | AC | 366 ms | 22452 KB |
subtask_1_25.txt | AC | 382 ms | 22372 KB |
subtask_1_26.txt | AC | 369 ms | 23980 KB |
subtask_1_27.txt | AC | 309 ms | 40464 KB |
subtask_1_28.txt | AC | 319 ms | 40276 KB |
subtask_1_29.txt | AC | 371 ms | 22456 KB |
subtask_1_3.txt | AC | 4 ms | 3588 KB |
subtask_1_30.txt | AC | 351 ms | 22456 KB |
subtask_1_31.txt | AC | 345 ms | 22320 KB |
subtask_1_32.txt | AC | 355 ms | 23932 KB |
subtask_1_33.txt | AC | 309 ms | 40428 KB |
subtask_1_34.txt | AC | 307 ms | 40448 KB |
subtask_1_35.txt | AC | 341 ms | 22472 KB |
subtask_1_36.txt | AC | 347 ms | 22320 KB |
subtask_1_37.txt | AC | 345 ms | 22452 KB |
subtask_1_38.txt | AC | 344 ms | 23988 KB |
subtask_1_39.txt | AC | 349 ms | 40508 KB |
subtask_1_4.txt | AC | 29 ms | 18700 KB |
subtask_1_40.txt | AC | 353 ms | 40412 KB |
subtask_1_41.txt | AC | 167 ms | 3596 KB |
subtask_1_42.txt | AC | 170 ms | 3588 KB |
subtask_1_43.txt | AC | 256 ms | 27752 KB |
subtask_1_44.txt | AC | 287 ms | 40280 KB |
subtask_1_45.txt | AC | 169 ms | 3652 KB |
subtask_1_46.txt | AC | 376 ms | 22556 KB |
subtask_1_5.txt | AC | 38 ms | 12920 KB |
subtask_1_6.txt | AC | 17 ms | 13136 KB |
subtask_1_7.txt | AC | 5 ms | 4156 KB |
subtask_1_8.txt | AC | 6 ms | 5564 KB |
subtask_1_9.txt | AC | 49 ms | 5052 KB |