제출 #1204475

#제출 시각아이디문제언어결과실행 시간메모리
1204475PlayVoltz다리 (APIO19_bridges)C++20
100 / 100
1659 ms298568 KiB
#include <cstdio> #include <stdio.h> #include <stdbool.h> #include <iostream> #include <map> #include <vector> #include <climits> #include <stack> #include <string> #include <queue> #include <algorithm> #include <set> #include <unordered_set> #include <unordered_map> #include <cmath> #include <cctype> #include <bitset> #include <iomanip> #include <cstring> #include <numeric> #include <cassert> using namespace std; #define int long long #define pii pair<int, int> #define mp make_pair #define pb push_back #define fi first #define se second const int BLK = 1000; struct trio{ int a, b, c; }; vector<trio> quer; stack<int> del; vector<int> dsu, sz; int fp(int a){ if (dsu[a]==-1)return a; return fp(dsu[a]); } void merge(int a, int b){ a=fp(a), b=fp(b); if (a==b)return; if (sz[a]>sz[b])swap(a, b); sz[b]+=sz[a]; dsu[a]=b; del.push(a); } void undo(int k){ while (k--){ int a=del.top(); del.pop(); sz[dsu[a]]-=sz[a]; dsu[a]=-1; } } bool custom(trio a, trio b){ return a.c>b.c; } bool custom2(int a, int b){ return quer[a].c>quer[b].c; } int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m, q; cin>>n>>m; vector<trio> edges(m); for (int i=0; i<m; ++i)cin>>edges[i].a>>edges[i].b>>edges[i].c; cin>>q; vector<int> ans(q, -1); quer.resize(q); vector<vector<int> > add(q); for (int i=0; i<q; ++i)cin>>quer[i].a>>quer[i].b>>quer[i].c, --quer[i].b; for (int l=0, r=min(BLK, q); l<q; l+=BLK, r=min(r+BLK, q)){ dsu.assign(n+1, -1); sz.assign(n+1, 1); vector<bool> change(m+1, 0); vector<int> queries, changed; for (int i=l; i<r; ++i)if (quer[i].a==1)change[quer[i].b]=1, changed.pb(quer[i].b); vector<trio> vect; for (int i=0; i<m; ++i)if (!change[i])vect.pb(edges[i]); sort(vect.begin(), vect.end(), custom); for (int i=l; i<r; ++i){ if (quer[i].a==1)edges[quer[i].b].c=quer[i].c; else{ queries.pb(i); for (auto a:changed)if (edges[a].c>=quer[i].c)add[i].pb(a); } } sort(queries.begin(), queries.end(), custom2); int p=0; for (auto c:queries){ while (p<vect.size()&&vect[p].c>=quer[c].c)merge(vect[p].a, vect[p].b), ++p; int temp=del.size(); for (auto a:add[c])merge(edges[a].a, edges[a].b); ans[c]=sz[fp(quer[c].b+1)]; undo(del.size()-temp); } } for (auto a:ans)if (a!=-1)cout<<a<<"\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...