Submission #973546

#TimeUsernameProblemLanguageResultExecution timeMemory
973546vjudge1다리 (APIO19_bridges)C++14
73 / 100
3096 ms12424 KiB
#include<bits/stdc++.h> using namespace std; struct DSU{ int n; vector<int> lab; void init(int _n){ n=_n; lab.assign(n+1, -1); } int find_set(int u){ return lab[u]<0?u:lab[u]=find_set(lab[u]); } void union_sets(int u, int v){ u=find_set(u), v=find_set(v); if (u!=v){ if (lab[u]>lab[v]) swap(u, v); lab[u]+=lab[v]; lab[v]=u; } } } dsu; struct Edge{ int u, v, w; Edge (int _u=0, int _v=0, int _w=0){ u=_u, v=_v, w=_w; } }; struct Query{ int type, x, y; Query (int _type=0, int _x=0, int _y=0){ type=_type, x=_x, y=_y; } }; const int N=1e5+10, S=320; Edge e[N]; int idx[N], ans[N]; int n, m, q; int used[N]; Query qq[N]; vector<int> g[N]; int w[N]; int vis[N]; void dfs(int u, int &cnt){ vis[u]=1; cnt-=dsu.lab[u]; for (int v:g[u]) if (!vis[v]) dfs(v, cnt); } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; for (int i=1; i<=m; ++i){ cin >> e[i].u >> e[i].v >> e[i].w; } cin >> q; for (int i=1; i<=q; ++i){ cin >> qq[i].type >> qq[i].x >> qq[i].y; } iota(idx, idx+m+1, 0); for (int l=1, r=S; l<=q; l+=S, r+=S){ r=min(r, q); vector<int> vv; vector<int> edge; for (int i=l; i<=r; ++i){ if (qq[i].type==1){ used[qq[i].x]=1; edge.push_back(qq[i].x); }else vv.push_back(i); } sort(idx+1, idx+m+1, [&](int x, int y){ return make_pair(!used[x], e[x].w)>make_pair(!used[y], e[y].w); }); sort(vv.begin(), vv.end(), [&](int x, int y){ return qq[x].y>qq[y].y; }); dsu.init(n); int id=1; for (int i:vv){ while (id<=m && !used[idx[id]] && e[idx[id]].w>=qq[i].y){ dsu.union_sets(e[idx[id]].u, e[idx[id]].v); ++id; } for (int j:edge) w[j]=e[j].w; for (int j=l; j<=i; ++j) if (qq[j].type==1) w[qq[j].x]=qq[j].y; vector<int> vertex; for (int j:edge) if (w[j]>=qq[i].y){ int cc1=dsu.find_set(e[j].u), cc2=dsu.find_set(e[j].v); if (cc1!=cc2){ vertex.push_back(cc1); vertex.push_back(cc2); g[cc1].push_back(cc2); g[cc2].push_back(cc1); } } dfs(dsu.find_set(qq[i].x), ans[i]); vis[dsu.find_set(qq[i].x)]=0; for (int j:vertex) g[j].clear(), vis[j]=0; } for (int i=l; i<=r; ++i) if (qq[i].type==1) e[qq[i].x].w=qq[i].y, used[qq[i].x]=0; } for (int i=1; i<=q; ++i) if (qq[i].type==2) cout << ans[i] << '\n'; return 0; }
#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...