제출 #1188918

#제출 시각아이디문제언어결과실행 시간메모리
1188918alexddCollapse (JOI18_collapse)C++20
5 / 100
15088 ms13496 KiB
#include "collapse.h" #include<bits/stdc++.h> using namespace std; int n; struct DSU { int father[100005],siz[100005]; vector<pair<pair<int,int>,int>> history; void init() { history.clear(); for(int i=0;i<n;i++) father[i]=i, siz[i]=1; } int gas(int x) { if(father[x]!=x) father[x] = gas(father[x]); return father[x]; /*if(father[x]!=x) return gas(father[x]); return x;*/ } void unite(int x, int y) { x = gas(x); y = gas(y); if(x==y) return; history.push_back({{y,father[y]},0}); history.push_back({{x,siz[x]},1}); father[y] = x; siz[x] += siz[y]; } int get_time() { return history.size(); } void rollback(int t) { while((int)history.size() > t) { if(history.back().second == 0) father[history.back().first.first] = history.back().first.second; else siz[history.back().first.first] = history.back().first.second; history.pop_back(); } } }; vector<pair<pair<int,int>,pair<int,int>>> edges; void add_edge(int tle, int tri, int x, int y) { assert(tle<=tri); assert(x<=y); edges.push_back({{tle,tri},{x,y}}); } std::vector<int> simulateCollapse( int N, std::vector<int> T, std::vector<int> X, std::vector<int> Y, std::vector<int> W, std::vector<int> P) { n=N; map<pair<int,int>,int> construction_day; for(int i=0;i<T.size();i++) { if(X[i] > Y[i]) swap(X[i],Y[i]); if(T[i]==0) { construction_day[{X[i],Y[i]}] = i; } else { add_edge(construction_day[{X[i],Y[i]}],i-1,X[i],Y[i]); construction_day[{X[i],Y[i]}] = -1; } } for(auto it:construction_day) { if(it.second != -1) { add_edge(it.second, (int)T.size() + 2, it.first.first, it.first.second); } } vector<int> sol((int)W.size()); DSU dsu; dsu.init(); for(int i=0;i<W.size();i++) { dsu.rollback(0); for(auto [t,e]:edges) { if(t.first <= W[i] && W[i] <= t.second && (e.second <= P[i] || e.first > P[i])) { dsu.unite(e.first, e.second); } } sol[i] = n - dsu.get_time()/2; continue; int sum = dsu.get_time()/2; dsu.init(); for(auto [t,e]:edges) { if(t.first <= W[i] && W[i] <= t.second && e.first > P[i]) { dsu.unite(e.first, e.second); } } sum += dsu.get_time()/2; sol[i] = n - sum; } return sol; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...