Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
33006 | Aquizahv | 【S】T2 | C++ | 解答错误 | 60 | 389 MS | 180796 KB | 2238 | 2024-10-02 18:38:19 |
#include <bits/stdc++.h> using namespace std; const int N = 2005, M = 5005; int n, m, Q, type, st, ed, pa[13][N][N]; vector<int> g[N], h[N]; bool go[N][N], vis[N], lmt[N][N]; void dfs(int u) { vis[u] = go[u][st] = true; for (int v : h[u]) if (!vis[v]) dfs(v); } int trans(int x, int lst) { return ((x ^ lst) % n) + 1; } bool dfs2(int u, int ed) { // if (u == 1 && ed == 1) // cout << "check" << endl; if (vis[u]) return lmt[u][ed]; vis[u] = true; if (u == ed) return lmt[u][ed] = true; if (!go[u][ed]) { // if (u == 96 && ed == 1) // cout << "check" << endl; return lmt[u][ed] = false; } return lmt[u][ed] = dfs2(pa[0][u][ed], ed); } int jump(int u, int v, int len) { for (int k = 10; k >= 0; k--) if (len & (1 << k)) u = pa[k][u][v]; return u; } int main() { #ifndef ONLINE_JUDGE freopen("data.in", "r", stdin); freopen("data.out", "w", stdout); #endif cin >> n >> m >> Q >> type; int u, v; for (int i = 1; i <= m; i++) scanf("%d%d", &u, &v), g[u].push_back(v), h[v].push_back(u); for (st = 1; st <= n; st++) { memset(vis, 0, sizeof(vis)); dfs(st), sort(g[st].begin(), g[st].end()); } for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) if (i != j) { if (go[i][j]) for (int v : g[i]) { pa[0][i][j] = v; break; } } for (int i = 1; i <= n; i++) // end point { memset(vis, 0, sizeof(vis)); for (int j = 1; j <= n; j++) if (i != j && !vis[j]) dfs2(j, i); } for (int k = 1; k <= 10; k++) for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) pa[k][i][j] = pa[k - 1][pa[k - 1][i][j]][j]; int k, lst = 1; while (Q--) { scanf("%d%d%d", &st, &ed, &k); // cout << st << ' ' << ed << ' ' << k << endl; if (type) st = trans(st, lst), ed = trans(ed, lst), k = trans(k, lst); k--; // cout << lst << ' ' << st << ' ' << ed << ' ' << k << endl; if (!go[st][ed] || !lmt[st][ed]) { // cout << go[st][ed] << ' ' << lmt[st][ed] << endl; puts("-1"), lst = 1; continue; } int u = jump(st, ed, k); if (!u) { puts("-1"), lst = 1; continue; } printf("%d\n", lst = u); } return 0; }