제출 #1229829

#제출 시각아이디문제언어결과실행 시간메모리
1229829duyngadocton다리 (APIO19_bridges)C++20
73 / 100
3064 ms108428 KiB
#include<bits/stdc++.h> using namespace std; #define fi first #define se second #define ii pair<int,int> #define iii pair<ii,int> #define pb push_back #define eb emplace_back const int MAX = (int) 1e5; const int B = 400; int n, m, q; int ans[MAX + 5]; stack<ii> st; int par[MAX + 5], sz[MAX + 5]; int nho[MAX + 5]; int find_root(int u) { return (u == par[u]) ? u : find_root(par[u]); } void make_set(int u, int v) { u = find_root(u), v = find_root(v); if(u == v) return; if(sz[u] < sz[v]) swap(u, v); par[v] = u; sz[u] += sz[v]; st.push(ii(u, v)); } void rollback(int x) { while(st.size() > x) { ii x = st.top(); int u = x.fi, v = x.se; par[v] = v; sz[u] -= sz[v]; st.pop(); } } int block(int l) { return (l - 1) / B + 1; } int start(int l) { return (l - 1) * B + 1; } int stop(int l) { return min(q, l * B); } struct edge { int u, v, d; edge(int _u = 0, int _v = 0, int _d = 0) : u(_u), v(_v), d(_d) {} } E[MAX + 5]; struct queries { int t, x, y; queries(int _t = 0, int _x = 0, int _y = 0) : x(_x), y(_y), t(_t) {} } query[MAX + 5]; int w[MAX + 5]; vector<ii> tmp[MAX + 5]; int main() { ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin >> n >> m; for(int i = 1; i <= m; ++i) { int u, v, d; cin >> u >> v >> d; w[i] = d; E[i] = edge(u, v, d); } cin >> q; for(int i = 1; i <= q; ++i) { int t, x, y; cin >> t >> x >> y; query[i] = queries(t, x, y); } for(int SQRT = 1; SQRT <= block(q); ++SQRT) { int l = start(SQRT), r = stop(SQRT); vector<int> cur; while(!st.empty()) st.pop(); vector<int> qr; for(int i = 1; i <= n; ++i) par[i] = i, sz[i] = 1; for(int i = 1; i <= m; ++i) nho[i] = 0; for(int i = l; i <= r; ++i) if(query[i].t == 1) { nho[query[i].x] = 1; } else { qr.pb(i); } sort(qr.begin(), qr.end(), [](int x, int y) { return query[x].y > query[y].y; }); for(int i = 1; i <= m; ++i) if(nho[i] == 0) { cur.pb(i); } for(int i = l; i <= r; ++i) if(query[i].t == 1) { w[query[i].x] = query[i].y; } else { for(int j = l; j <= r; ++j) if(query[j].t == 1 && w[query[j].x] >= query[i].y) { tmp[i].pb(ii(E[query[j].x].u, E[query[j].x].v)); } } sort(cur.begin(), cur.end(), [](int x, int y) { return w[x] > w[y]; }); int ptr = 0; for(int x : qr) { while(ptr < cur.size() && w[cur[ptr]] >= query[x].y) { int u = E[cur[ptr]].u, v = E[cur[ptr]].v; make_set(u, v); ++ptr; } int prev = st.size(); for(ii j : tmp[x]) { int u = j.fi, v = j.se; make_set(u, v); } ans[x] = sz[find_root(query[x].x)]; rollback(prev); } } for(int i = 1; i <= q; ++i) if(query[i].t == 2) cout << ans[i] << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...