제출 #130238

#제출 시각아이디문제언어결과실행 시간메모리
130238combi1k1다리 (APIO19_bridges)C++14
30 / 100
3034 ms11956 KiB
#include<bits/stdc++.h> using namespace std; const int N = 1e5 + 5; const int B = 300; #define pb push_back #define all(x) x.begin(),x.end() #define sz(x) x.size() #define X first #define Y second typedef pair<int,int> ii; typedef pair<int,ii> pii; typedef vector<pii> vi; struct Edge { int x, y; int w, i; bool operator < (const Edge &a) const { return ii(w,i) > ii(a.w,a.i); } }; struct Ques { int mas, ver, idx; bool operator < (const Ques& a) const { return mas > a.mas; } }; bool uV[N], uE[N]; namespace DSU { int p[N], s[N]; int lead(int x) { return p[x] == x ? x : p[x] = lead(p[x]); } int join(int x,int y) { x = lead(x); y = lead(y); if (x == y) return 0; if (uV[y]) swap(x,y); p[y] = x; s[x] += s[y]; return 1; } }; set<Edge> E; int n, m; int x[N], y[N], w[N]; void calc(vector<Ques> qr) { iota(DSU::p + 1,DSU::p + 1 + n,1); fill(DSU::s + 1,DSU::s + 1 + n,1); fill(uV + 1,uV + 1 + n,0); fill(uE + 1,uE + 1 + m,0); vector<Ques> sta; vector<int> vx; vector<int> ed; map<int,vi> mp; for(Ques t : qr) { if(!t.idx) uE[t.ver] = 1, uV[x[t.ver]] = uV[y[t.ver]] = 1; else sta.pb(t), uV[t.ver] = 1; } for(int i = 1 ; i <= n ; ++i) if (uV[i]) vx.pb(i); for(int i = 1 ; i <= m ; ++i) if (uE[i]) ed.pb(i); sort(all(sta)); auto it = E.begin(); for(Ques t : sta) { while (it != E.end() && (*it).w >= t.mas) { if(!uE[(*it).i]) DSU::join((*it).x,(*it).y); it++; } for(int x : vx) mp[t.idx].pb(pii(x,{DSU::lead(x),DSU::s[DSU::p[x]]})); } for(Ques q : qr) { if(!q.idx) { Edge it = *E.find({x[q.ver],y[q.ver],w[q.ver],q.ver}); E.erase(it); it.w = w[q.ver] = q.mas; E.insert(it); continue; } for(pii t : mp[q.idx]) DSU::p[t.X] = t.Y.X, DSU::s[t.X] = t.Y.Y; for(int i : ed) if (w[i] >= q.mas) DSU::join(x[i],y[i]); cout << DSU::s[DSU::lead(q.ver)] << "\n"; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; for(int i = 1 ; i <= m ; ++i) { cin >> x[i] >> y[i] >> w[i]; E.insert({x[i],y[i],w[i],i}); } int q; cin >> q; vector<Ques> v; for(int i = 1 ; i <= q ; ++i) { int t, x, y; cin >> t >> x >> y; if (t == 1) v.pb({y,x,0}); if (t == 2) v.pb({y,x,i}); } for(int i = 0 ; i < q ; i += B) calc(vector<Ques>(v.begin() + i,v.begin() + min((int)v.size(),i + B))); }
#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...