萌新求助kruskal重构树+主席树

P4197 Peaks

@[Svemit](/user/503792) $104$ 行,$n \to size_{hs}$ 就过了 /kel
by _sunkuangzheng_ @ 2023-10-06 20:57:27


@[_sunkuangzheng_](/user/923947) thx,已经调出来了,但是加强版没过/ng(
by Svemit @ 2023-10-06 21:00:35


@[Svemit](/user/503792) 加强版要判图不连通 /kk
by _sunkuangzheng_ @ 2023-10-06 21:01:01


@[_sunkuangzheng_](/user/923947) 没过/fad ```cpp #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef pair<int, int> PII; const int N = 2e5 + 5, M = 5e5 + 5, INF = 0x3f3f3f3f; const LL mod = 1e9 + 7; int n, m, q; int h[N]; vector<int> hs; array<int, 3> edge[M]; vector<int> e[N]; int val[N], fa[N][25], p[N], L[N], R[N], dep[N]; struct DSU { int fa[N]; void init() { for(int i = 1; i <= n * 2; i ++) fa[i] = i; } int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); } } dsu; int tot, idx; void dfs(int u, int fath) { L[u] = idx; if(u <= n) p[++ idx] = u; dep[u] = dep[fath] + 1; fa[u][0] = fath; for(int i = 1; i <= __lg(dep[u]); i ++) fa[u][i] = fa[fa[u][i - 1]][i - 1]; for(auto v : e[u]) dfs(v, u); R[u] = idx; } struct SegT { int l, r, val; #define l(x) tr[x].l #define r(x) tr[x].r #define val(x) tr[x].val } tr[N << 5]; int rt[N], cnt; void pushup(int x) { val(x) = val(l(x)) + val(r(x)); } void build(int &x, int l, int r) { x = ++ cnt; if(l == r) return; int mid = l + r >> 1; build(l(x), l, mid), build(r(x), mid + 1, r); } void insert(int &x, int lst, int pos, int l, int r) { x = ++ cnt; tr[x] = tr[lst]; if(l == r) { val(x) ++; return; } int mid = l + r >> 1; if(pos <= mid) insert(l(x), l(lst), pos, l, mid); else insert(r(x), r(lst), pos, mid + 1, r); pushup(x); } int query(int x, int y, int l, int r, int k) { if(l == r) return l; int cnt = val(r(y)) - val(r(x)), mid = l + r >> 1; if(k <= cnt) return query(r(x), r(y), mid + 1, r, k); else return query(l(x), l(y), l, mid, k - cnt); } int get(int u, int x) { for(int i = 19; ~i; i --) if(val[fa[u][i]] <= x) u = fa[u][i]; return u; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m >> q; for(int i = 1; i <= n; i ++) { cin >> h[i]; hs.push_back(h[i]); } sort(hs.begin(), hs.end()); hs.erase(unique(hs.begin(), hs.end()), hs.end()); for(int i = 1; i <= n; i ++) { h[i] = lower_bound(hs.begin(), hs.end(), h[i]) - hs.begin() + 1; } tot = n; dsu.init(); for(int i = 1; i <= m; i ++) cin >> edge[i][1] >> edge[i][2] >> edge[i][0]; sort(edge + 1, edge + 1 + m); for(int i = 1; i <= m; i ++) { int u = dsu.find(edge[i][1]), v = dsu.find(edge[i][2]); if(u == v) continue; tot ++; dsu.fa[u] = dsu.fa[v] = tot; e[tot].push_back(u); e[tot].push_back(v); val[tot] = edge[i][0]; } val[0] = INF; for(int i = tot; i >= 1; i --) if(dsu.fa[i] == i) dfs(i, 0); build(rt[0], 1, hs.size()); for(int i = 1; i <= n; i ++) { insert(rt[i], rt[i - 1], h[p[i]], 1, hs.size()); } int lst = 0; while(q --) { int v, x, k; cin >> v >> x >> k; v = (v ^ lst) % n + 1; k = (k ^ lst) % n + 1; x ^= lst; v = get(v, x); if(R[v] - L[v] < k) cout << -1 << '\n'; else cout << hs[query(rt[L[v]], rt[R[v]], 1, hs.size(), k) - 1] << '\n'; } return 0; } ```
by Svemit @ 2023-10-06 21:04:20


@[_sunkuangzheng_](/user/923947) 已经过了,thx
by Svemit @ 2023-10-06 21:17:08


|