Submission #1150935

#TimeUsernameProblemLanguageResultExecution timeMemory
1150935Math4Life2020Bridges (APIO19_bridges)C++20
30 / 100
3096 ms39700 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<ll,ll>; ll N,M; const ll Nm = 5e4+5; vector<array<ll,3>> edg; //{u,v,d} vector<array<ll,3>> upd0; //DSU with simple rollback vector<ll> f[Nm]; vector<ll> sz[Nm]; vector<ll> rbk; //positive -> f, negative -> sz ll gt(ll x) { if (f[x].back()==x) { return x; } else { return gt(f[x].back()); } } void rollbk() { for (ll x: rbk) { if (x>0) { f[x-1].pop_back(); } else { sz[-x-1].pop_back(); } } rbk.clear(); } void fz(ll a, ll b) { a = gt(a); b = gt(b); if (a==b) { return; } if (sz[a].back()>sz[b].back()) { swap(a,b); } sz[b].push_back(sz[a].back()+sz[b].back()); rbk.push_back(-1-b); f[a].push_back(b); rbk.push_back(1+a); } void UPD(vector<array<ll,3>> upd) { ll K = upd.size(); vector<ll> ans(K,-1); rbk.clear(); for (ll i=0;i<Nm;i++) { f[i].clear(); sz[i].clear(); f[i].push_back(i); sz[i].push_back(1); } ll tupd[M]; for (ll m=0;m<M;m++) { tupd[m]=-1; } ll NSP=0; //number of special edges ll cwt[K]; ll itupd[K]; vector<pii> ttf[K]; //things to fuse for (ll k=0;k<K;k++) { if (upd[k][0]==2) { continue; } if (tupd[upd[k][1]]==-1) { cwt[NSP]=edg[upd[k][1]][2]; //cout << "cwt["<<NSP<<"]="<<cwt[NSP]<<"\n"; tupd[upd[k][1]]=NSP; //cout << "tupd["<<upd[k][1]<<"]="<<NSP<<"\n"; itupd[NSP]=upd[k][1]; NSP++; } } vector<array<ll,3>> vmod; for (ll m=0;m<M;m++) { if (tupd[m]==-1) { vmod.push_back({edg[m][2],1,m}); } } for (ll k=0;k<K;k++) { if (upd[k][0]==2) { ll wt = upd[k][2]; for (ll n=0;n<NSP;n++) { if (cwt[n]<=wt) { ll eind = itupd[n]; ttf[k].push_back({edg[eind][0],edg[eind][1]}); } } vmod.push_back({wt,2,k}); } else { assert(upd[k][0]==1); cwt[tupd[upd[k][1]]]=upd[k][2]; } } sort(vmod.begin(),vmod.end()); for (auto A0: vmod) { if (A0[1]==1) { ll m = A0[2]; fz(edg[m][0],edg[m][1]); } else { rbk.clear(); ll k = A0[2]; for (pii p0: ttf[k]) { fz(p0.first,p0.second); } ll xc = upd[k][1]; ans[k] = sz[gt(xc)].back(); rollbk(); } } for (ll k=0;k<K;k++) { if (upd[k][0]==2) { cout << ans[k]<<"\n"; } } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> N >> M; set<ll> sw0; for (ll m=0;m<M;m++) { ll u,v,d; cin >> u >> v >> d; u--; v--; sw0.insert(d); edg.push_back({u,v,d}); } ll Q; cin >> Q; ll K = 256; //change to compile time constant (256??) for (ll q=0;q<Q;q++) { ll t,x,y; cin >> t >> x >> y; if (t==1) { x--; upd0.push_back({t,x,y}); sw0.insert(y); } else { x--; upd0.push_back({t,x,y}); sw0.insert(y); } } ll NCT = sw0.size()-1; map<ll,ll> mw; for (ll x: sw0) { mw[x]=(NCT--); } for (ll i=0;i<M;i++) { edg[i][2]=mw[edg[i][2]]; //cout << "edg: "<<edg[i][0]<<" "<<edg[i][1]<<" "<<edg[i][2]<<"\n"; } for (ll q=0;q<Q;q++) { upd0[q][2]=mw[upd0[q][2]]; } for (ll kt=0;kt<=(Q/K);kt++) { ll xmin = K*kt; ll xmax = min(K*(kt+1),Q); vector<array<ll,3>> vupd; for (ll x=xmin;x<xmax;x++) { vupd.push_back(upd0[x]); //cout << "UPD term: "<<upd0[x][0]<<" "<<upd0[x][1]<<" "<<upd0[x][2]<<"\n"; } UPD(vupd); for (ll x=xmin;x<xmax;x++) { if (upd0[x][0]==1) { ll b = upd0[x][1]; ll d = upd0[x][2]; edg[b][2]=d; } } } }
#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...