제출 #1256130

#제출 시각아이디문제언어결과실행 시간메모리
1256130minhpkCollapse (JOI18_collapse)C++20
0 / 100
61 ms97476 KiB
#include "collapse.h" #include <bits/stdc++.h> using namespace std; int a,b,c; struct dsu{ int par[1000005]; int sz[1000005]; int cnt; vector <pair<int,int>> st; void init(){ cnt=0; for (int i=1;i<=a;i++){ par[i]=i; sz[i]=1; } } 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_back({-1,-1}); return; } if (sz[x]<sz[y]){ swap(x,y); } st.push_back({x,y}); par[y]=x; sz[x]+=sz[y]; cnt++; } void rollback(){ auto [x,y] =st.back(); st.pop_back(); if (x==-1){ return; } cnt--; par[y]=y; sz[x]-=sz[y]; } }; dsu d; int block=320; vector <int> q[1000005]; set<pair<int,int>> s; vector <pair<int,int>> v[1000005]; vector<int> pos[1000005]; vector <int> z[1000005]; vector<int> simulateCollapse(int N,vector<int> T,vector<int> X,vector<int> Y,vector<int> W,vector<int> P){ a=N; b=T.size(); c=W.size(); vector <int> res(c,0); for (int i=0;i<c;i++){ q[W[i]].push_back(i); } for (int t=0;t<b;t+=block){ set<pair<int,int>> s1; for (int i=t;i<min(t+block,b);i++){ int x=X[i]; int y=Y[i]; if (x>y){ swap(x,y); } if (s.find({x,y})!=s.end()){ s.erase({x,y}); s1.insert({x,y}); } } for (int i=t;i<min(t+block,b);i++){ int x=X[i]; int y=Y[i]; if (x>y){ swap(x,y); } if (T[i]){ s1.erase({x,y}); }else{ s1.insert({x,y}); } for (auto p:s1){ v[i].push_back(p); } for (auto p:q[i]){ pos[P[p]].push_back(p); } } d.init(); for (int i=0;i<=a;i++){ z[i].clear(); } for (auto p:s){ z[p.second].push_back(p.first); } for (int i=0;i<a;i++){ for (auto p:z[i]){ d.join(p,i); } for (auto p:pos[i]){ for (auto j:v[W[p]]){ if (j.second<=P[p]){ d.join(j.first,j.second); } } res[p]+=d.cnt; for (auto j:v[W[p]]){ if (j.second<=P[p]){ d.rollback(); } } } } d.init(); for (int i=0;i<=a;i++){ z[i].clear(); } for (auto p:s){ z[p.first].push_back(p.second); } for (int i=a-1;i>=0;i--){ for (auto p:pos[i]){ for (auto j:v[W[p]]){ if (j.second<=P[p]){ d.join(j.first,j.second); } } res[p]+=d.cnt; for (auto j:v[W[p]]){ if (j.second<=P[p]){ d.rollback(); } } } for (auto p:z[i]){ d.join(p,i); } } for (int i=0;i<=a;i++){ pos[i].clear(); } for (auto p:s1){ s.insert(p); } } for (int i=0;i<c;i++){ res[i]=a-res[i]; } return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...