Submission #404127

#TimeUsernameProblemLanguageResultExecution timeMemory
404127thomas_liBridges (APIO19_bridges)C++17
30 / 100
3091 ms146296 KiB
#pragma GCC optimize("Ofast") #pragma GCC target("avx,avx2,fma") #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pi; const int MM = 5e4+5,SZ = 1e3; struct DSU{ struct op{ int u,su,v,sv; }; stack<op> ev; vector<int> p, sz; DSU(int n) : p(n), sz(n, 1) { iota(p.begin(), p.end(),0); } void clear(){ for(int i = 0; i < p.size(); i++) p[i] = i, sz[i] = 1; } // no path compression due to undo operation int find(int u) { return u == p[u] ? u : find(p[u]); } void join(int u, int v){ u = find(u); v = find(v); if(sz[u] > sz[v]) swap(u,v); ev.push({u,sz[u], v,sz[v]}); if(u == v) return; sz[v] += sz[u]; p[u] = v; } void undo(){ op e = ev.top(); ev.pop(); sz[e.u] = e.su; sz[e.v] = e.sv; p[e.u] = e.u; p[e.v] = e.v; } int get_size(int u) { return sz[find(u)]; } bool same_set(int u, int v) { return find(u) == find(v); } }; vector<int> ext[SZ]; int main(){ cin.tie(0)->sync_with_stdio(0); int n,m,q; cin >> n >> m; vector<array<int,3>> el,qu; for(int i = 0; i < m; i++){ int u,v,w; cin >> u >> v >> w; u--; v--; el.push_back({u,v,w}); } cin >> q; vector<int> ans(q); for(int i = 0; i < q; i++){ int t,a,b; cin >> t >> a >> b; a--; qu.push_back({t,a,b}); } DSU d(n); bitset<MM*2> mod; for(int l = 0; l < q; l += SZ){ d.clear(); mod.reset(); int r = min(q-1,l+SZ-1); vector<int> cur_u,cur_q,old; for(int i = l; i <= r; i++){ auto[t,a,b] = qu[i]; if(t == 1){ mod[a] = 1; cur_u.emplace_back(i); } else{ cur_q.emplace_back(i); } } for(int i = 0; i < m; i++){ if(!mod[i]) old.emplace_back(i); } for(int i = l; i <= r; i++){ auto[t,a,b] = qu[i]; if(t == 1){ auto&[u,v,w] = el[a]; w = b; } else{ ext[i-l].clear(); for(int x : cur_u){ if(el[qu[x][1]][2] >= b){ ext[i-l].emplace_back(qu[x][1]); } } } } sort(old.begin(),old.end(),[&](const auto& ls, const auto& rs){ return el[ls][2] > el[rs][2]; }); sort(cur_q.begin(),cur_q.end(),[&](const auto& ls, const auto& rs){ return qu[ls][2] > qu[rs][2]; }); int ptr = 0; for(int i = 0; i < (int)cur_q.size(); i++){ while(ptr < (int)old.size() && el[old[ptr]][2] >= qu[cur_q[i]][2]){ d.join(el[old[ptr]][0],el[old[ptr]][1]); ptr++; } int cnt = 0; for(int x : ext[cur_q[i] - l]){ d.join(el[x][0],el[x][1]); cnt++; } ans[cur_q[i]] = d.get_size(qu[cur_q[i]][1]); while(cnt--) d.undo(); } } for(int i = 0; i < q; i++){ if(qu[i][0] == 2) cout << ans[i] << "\n"; } }

Compilation message (stderr)

bridges.cpp: In member function 'void DSU::clear()':
bridges.cpp:18:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   18 |   for(int i = 0; i < p.size(); i++) p[i] = i, sz[i] = 1;
      |                  ~~^~~~~~~~~~
#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...