#include "collapse.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int MAXN = 1e5;
const int SQ = 800;
struct Query { int t, x, y, p; };
int N, C, Q;
Query A[MAXN+10], B[MAXN+10], V[MAXN*2+10];
vector<int> ans;
struct UF
{
int par[MAXN+10], sz[MAXN+10];
vector<int> S;
void init()
{
int i, j;
S.clear();
for(i=1; i<=N; i++) par[i]=i, sz[i]=1;
}
int Find(int x) { return x==par[x] ? x : Find(par[x]); }
int Union(int x, int y)
{
x=Find(x); y=Find(y);
if(x==y) return 0;
if(sz[x]<sz[y]) swap(x, y);
sz[x]+=sz[y]; par[y]=x;
S.push_back(y);
return 1;
}
void restore()
{
int v=S.back(); S.pop_back();
sz[par[v]]-=sz[v];
par[v]=v;
}
}uf;
vector<int> simulateCollapse(int _N, vector<int> _T, vector<int> _X, vector<int> _Y, vector<int> _W, vector<int> _P)
{
int i, j, k, p, q;
N=_N; C=_T.size(); Q=_W.size(); ans.resize(Q, N);
for(i=0; i<C; i++) if(_X[i]>_Y[i]) swap(_X[i], _Y[i]);
for(i=0; i<C; i++) A[i+1]={_T[i], _X[i]+1, _Y[i]+1, i+1};
for(i=0; i<Q; i++) B[i+1]={-1, _P[i]+1, i, _W[i]+1};
for(i=1; i<=C; i++) V[i]=A[i];
for(i=1; i<=Q; i++) V[i+C]=B[i];
sort(V+1, V+C+Q+1, [&](const Query &p, const Query &q)
{
if(p.p!=q.p) return p.p<q.p;
else return p.t>q.t;
});
for(i=0; i<=(C+Q)/SQ; i++)
{
int l=max(1, i*SQ), r=min(C+Q, (i+1)*SQ-1);
set<pii> S;
vector<pii> E1, E2;
vector<int> query;
for(j=1; j<l; j++)
{
if(V[j].t==0) S.insert({V[j].x, V[j].y});
else if(V[j].t==1) S.erase({V[j].x, V[j].y});
}
for(j=l; j<=r; j++)
{
if(V[j].t==-1)
{
query.push_back(j);
}
else
{
if(S.count({V[j].x, V[j].y}))
{
S.erase({V[j].x, V[j].y});
E2.push_back({V[j].x, V[j].y});
}
}
}
for(auto it : S) E1.push_back(it);
sort(E1.begin(), E1.end(), [&](const pii &p, const pii &q) { return p.second<q.second; });
sort(E2.begin(), E2.end(), [&](const pii &p, const pii &q) { return p.second<q.second; });
sort(query.begin(), query.end(), [&](const int &p, const int &q) { return V[p].x<V[q].x; });
uf.init(); j=0;
for(auto &it : query)
{
for(; j<E1.size() && E1[j].second<=V[it].x; j++) uf.Union(E1[j].first, E1[j].second);
set<pii> S1, S2;
for(p=l; p<=it; p++)
{
if(V[p].t==-1) continue;
if(V[p].y>V[it].x) continue;
if(V[p].t==0) S1.insert({V[p].x, V[p].y});
else S1.erase({V[p].x, V[p].y});
S2.insert({V[p].x, V[p].y});
}
int cnt=0;
for(auto jt : S1) cnt+=uf.Union(jt.first, jt.second);
for(auto jt : E2) if(jt.second<=V[it].x && !S2.count(jt)) cnt+=uf.Union(jt.first, jt.second);
ans[V[it].y]-=uf.S.size();
while(cnt--) uf.restore();
}
sort(E1.begin(), E1.end(), [&](const pii &p, const pii &q) { return p.first>q.first; });
sort(E2.begin(), E2.end(), [&](const pii &p, const pii &q) { return p.first>q.first; });
sort(query.begin(), query.end(), [&](const int &p, const int &q) { return V[p].x>V[q].x; });
uf.init(); j=0;
for(auto &it : query)
{
for(; j<E1.size() && E1[j].first>V[it].x; j++) uf.Union(E1[j].first, E1[j].second);
set<pii> S1, S2;
for(p=l; p<=it; p++)
{
if(V[p].t==-1) continue;
if(V[p].x<=V[it].x) continue;
if(V[p].t==0) S1.insert({V[p].x, V[p].y});
else S1.erase({V[p].x, V[p].y});
S2.insert({V[p].x, V[p].y});
}
int cnt=0;
for(auto jt : S1) cnt+=uf.Union(jt.first, jt.second);
for(auto jt : E2) if(jt.first>V[it].x && !S2.count(jt)) cnt+=uf.Union(jt.first, jt.second);
ans[V[it].y]-=uf.S.size();
while(cnt--) uf.restore();
}
}
return ans;
}
Compilation message
collapse.cpp: In member function 'void UF::init()':
collapse.cpp:24:10: warning: unused variable 'j' [-Wunused-variable]
int i, j;
^
collapse.cpp: In function 'std::vector<int> simulateCollapse(int, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
collapse.cpp:100:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(; j<E1.size() && E1[j].second<=V[it].x; j++) uf.Union(E1[j].first, E1[j].second);
~^~~~~~~~~~
collapse.cpp:124:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(; j<E1.size() && E1[j].first>V[it].x; j++) uf.Union(E1[j].first, E1[j].second);
~^~~~~~~~~~
collapse.cpp:48:12: warning: unused variable 'k' [-Wunused-variable]
int i, j, k, p, q;
^
collapse.cpp:48:18: warning: unused variable 'q' [-Wunused-variable]
int i, j, k, p, q;
^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
14 ms |
896 KB |
Output is correct |
2 |
Correct |
9 ms |
680 KB |
Output is correct |
3 |
Correct |
10 ms |
640 KB |
Output is correct |
4 |
Correct |
10 ms |
640 KB |
Output is correct |
5 |
Correct |
88 ms |
932 KB |
Output is correct |
6 |
Correct |
172 ms |
1272 KB |
Output is correct |
7 |
Correct |
12 ms |
640 KB |
Output is correct |
8 |
Correct |
12 ms |
640 KB |
Output is correct |
9 |
Correct |
118 ms |
976 KB |
Output is correct |
10 |
Correct |
179 ms |
1144 KB |
Output is correct |
11 |
Correct |
195 ms |
1280 KB |
Output is correct |
12 |
Correct |
188 ms |
1268 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
103 ms |
5880 KB |
Output is correct |
2 |
Correct |
103 ms |
5912 KB |
Output is correct |
3 |
Correct |
2227 ms |
11416 KB |
Output is correct |
4 |
Correct |
104 ms |
5880 KB |
Output is correct |
5 |
Correct |
3136 ms |
11256 KB |
Output is correct |
6 |
Correct |
334 ms |
6432 KB |
Output is correct |
7 |
Correct |
7983 ms |
17628 KB |
Output is correct |
8 |
Correct |
3037 ms |
13816 KB |
Output is correct |
9 |
Correct |
134 ms |
7544 KB |
Output is correct |
10 |
Correct |
123 ms |
7416 KB |
Output is correct |
11 |
Correct |
194 ms |
7704 KB |
Output is correct |
12 |
Correct |
3621 ms |
14668 KB |
Output is correct |
13 |
Correct |
5973 ms |
17408 KB |
Output is correct |
14 |
Correct |
8753 ms |
21060 KB |
Output is correct |
15 |
Correct |
7814 ms |
21248 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
100 ms |
5880 KB |
Output is correct |
2 |
Correct |
103 ms |
5880 KB |
Output is correct |
3 |
Correct |
106 ms |
5788 KB |
Output is correct |
4 |
Correct |
108 ms |
5880 KB |
Output is correct |
5 |
Correct |
143 ms |
5880 KB |
Output is correct |
6 |
Correct |
428 ms |
6560 KB |
Output is correct |
7 |
Correct |
6546 ms |
14716 KB |
Output is correct |
8 |
Correct |
10174 ms |
18068 KB |
Output is correct |
9 |
Correct |
132 ms |
7416 KB |
Output is correct |
10 |
Correct |
202 ms |
7672 KB |
Output is correct |
11 |
Correct |
10230 ms |
21568 KB |
Output is correct |
12 |
Correct |
11028 ms |
21796 KB |
Output is correct |
13 |
Correct |
10505 ms |
21596 KB |
Output is correct |
14 |
Correct |
10957 ms |
21432 KB |
Output is correct |
15 |
Correct |
10013 ms |
21204 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
14 ms |
896 KB |
Output is correct |
2 |
Correct |
9 ms |
680 KB |
Output is correct |
3 |
Correct |
10 ms |
640 KB |
Output is correct |
4 |
Correct |
10 ms |
640 KB |
Output is correct |
5 |
Correct |
88 ms |
932 KB |
Output is correct |
6 |
Correct |
172 ms |
1272 KB |
Output is correct |
7 |
Correct |
12 ms |
640 KB |
Output is correct |
8 |
Correct |
12 ms |
640 KB |
Output is correct |
9 |
Correct |
118 ms |
976 KB |
Output is correct |
10 |
Correct |
179 ms |
1144 KB |
Output is correct |
11 |
Correct |
195 ms |
1280 KB |
Output is correct |
12 |
Correct |
188 ms |
1268 KB |
Output is correct |
13 |
Correct |
103 ms |
5880 KB |
Output is correct |
14 |
Correct |
103 ms |
5912 KB |
Output is correct |
15 |
Correct |
2227 ms |
11416 KB |
Output is correct |
16 |
Correct |
104 ms |
5880 KB |
Output is correct |
17 |
Correct |
3136 ms |
11256 KB |
Output is correct |
18 |
Correct |
334 ms |
6432 KB |
Output is correct |
19 |
Correct |
7983 ms |
17628 KB |
Output is correct |
20 |
Correct |
3037 ms |
13816 KB |
Output is correct |
21 |
Correct |
134 ms |
7544 KB |
Output is correct |
22 |
Correct |
123 ms |
7416 KB |
Output is correct |
23 |
Correct |
194 ms |
7704 KB |
Output is correct |
24 |
Correct |
3621 ms |
14668 KB |
Output is correct |
25 |
Correct |
5973 ms |
17408 KB |
Output is correct |
26 |
Correct |
8753 ms |
21060 KB |
Output is correct |
27 |
Correct |
7814 ms |
21248 KB |
Output is correct |
28 |
Correct |
100 ms |
5880 KB |
Output is correct |
29 |
Correct |
103 ms |
5880 KB |
Output is correct |
30 |
Correct |
106 ms |
5788 KB |
Output is correct |
31 |
Correct |
108 ms |
5880 KB |
Output is correct |
32 |
Correct |
143 ms |
5880 KB |
Output is correct |
33 |
Correct |
428 ms |
6560 KB |
Output is correct |
34 |
Correct |
6546 ms |
14716 KB |
Output is correct |
35 |
Correct |
10174 ms |
18068 KB |
Output is correct |
36 |
Correct |
132 ms |
7416 KB |
Output is correct |
37 |
Correct |
202 ms |
7672 KB |
Output is correct |
38 |
Correct |
10230 ms |
21568 KB |
Output is correct |
39 |
Correct |
11028 ms |
21796 KB |
Output is correct |
40 |
Correct |
10505 ms |
21596 KB |
Output is correct |
41 |
Correct |
10957 ms |
21432 KB |
Output is correct |
42 |
Correct |
10013 ms |
21204 KB |
Output is correct |
43 |
Correct |
4108 ms |
13312 KB |
Output is correct |
44 |
Correct |
9333 ms |
19528 KB |
Output is correct |
45 |
Correct |
4437 ms |
13964 KB |
Output is correct |
46 |
Correct |
10300 ms |
19952 KB |
Output is correct |
47 |
Correct |
133 ms |
7416 KB |
Output is correct |
48 |
Correct |
131 ms |
7416 KB |
Output is correct |
49 |
Correct |
217 ms |
7800 KB |
Output is correct |
50 |
Correct |
975 ms |
9092 KB |
Output is correct |
51 |
Correct |
4883 ms |
14716 KB |
Output is correct |
52 |
Correct |
6912 ms |
15776 KB |
Output is correct |
53 |
Correct |
6851 ms |
15748 KB |
Output is correct |
54 |
Correct |
8277 ms |
17416 KB |
Output is correct |
55 |
Correct |
8066 ms |
17420 KB |
Output is correct |
56 |
Correct |
9111 ms |
18372 KB |
Output is correct |
57 |
Correct |
9955 ms |
20112 KB |
Output is correct |
58 |
Correct |
10246 ms |
20160 KB |
Output is correct |
59 |
Correct |
10251 ms |
21372 KB |
Output is correct |
60 |
Correct |
11037 ms |
21244 KB |
Output is correct |