제출 #1261290

#제출 시각아이디문제언어결과실행 시간메모리
1261290minhpk다리 (APIO19_bridges)C++20
59 / 100
3091 ms411220 KiB
#include <bits/stdc++.h> using namespace std; int a,b; struct node{ int x,y,t; }; node z[100005]; set<pair<int,int>> s; int block = 320; struct query{ int c,x,y; }; query q[100005]; vector<pair<int,int>> pre[100005]; bool cmp(pair<int,int> A, pair<int,int> B){ return A.second > B.second; } bool cmp1(node A, node B){ return A.y > B.y; } int res[100005]; int curpos; int id[100005]; struct dsu{ int par[100005]; int sz[100005]; stack<pair<int,int>> st; void init(){ for (int i=1;i<=a;i++){ par[i]=i; sz[i]=1; } while (!st.empty()) st.pop(); } int find(int u){ if (par[u]==u) return u; return find(par[u]); } void join(int x,int y){ x = find(x); y = find(y); if (x==y){ st.push({-1,-1}); return; } if (sz[x] < sz[y]) swap(x,y); par[y] = x; sz[x] += sz[y]; st.push({x,y}); } void rollback(){ auto pr = st.top(); st.pop(); int x = pr.first, y = pr.second; if (x == -1) return; sz[x] -= sz[y]; par[y] = y; } } d; int main(){ ios::sync_with_stdio(false); cin.tie(NULL); if (!(cin >> a >> b)) return 0; for (int i=1;i<=b;i++){ cin >> z[i].x >> z[i].y >> z[i].t; s.insert({i, z[i].t}); } int sadge; cin >> sadge; curpos = 0; for (int i=1;i<=sadge;i++){ cin >> q[i].c >> q[i].x >> q[i].y; if (q[i].c == 2){ curpos++; id[i] = curpos; } } for (int t=1; t<=sadge; t += block){ set<pair<int,int>> s1; int fin = min(sadge, t + block - 1); vector<node> pos; for (int i=t;i<=fin;i++) pre[i].clear(); for (int i=t;i<=fin;i++){ if (q[i].c == 1){ auto it = s.lower_bound({q[i].x, INT_MIN}); if (it != s.end() && it->first == q[i].x){ s1.insert(*it); s.erase(it); } } else { pos.push_back({q[i].x, q[i].y, i}); } } for (int i=t;i<=fin;i++){ if (q[i].c == 1){ auto it = s1.lower_bound({q[i].x, INT_MIN}); if (it != s1.end() && it->first == q[i].x){ s1.erase(it); } s1.insert({q[i].x, q[i].y}); } for (auto p : s1) pre[i].push_back(p); } vector<pair<int,int>> z1; for (auto p : s) z1.push_back(p); sort(z1.begin(), z1.end(), cmp); sort(pos.begin(), pos.end(), cmp1); int cur = 0; d.init(); for (int i=0;i<(int)pos.size();i++){ int x = pos[i].x; int y = pos[i].y; int t1 = pos[i].t; while (cur < (int)z1.size() && z1[cur].second >= y){ int uidx = z1[cur].first; d.join(z[uidx].x, z[uidx].y); cur++; } for (auto p : pre[t1]){ if (p.second >= y){ int uidx = p.first; d.join(z[uidx].x, z[uidx].y); } } res[id[t1]] = d.sz[d.find(x)]; for (auto p : pre[t1]){ if (p.second >= y){ d.rollback(); } } } for (auto p : s1) s.insert(p); } for (int i=1;i<=curpos;i++){ cout << res[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...