#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 = 2000;
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; vector<pii> 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.push_back({V[p].x, V[p].y});
}
sort(S2.begin(), S2.end());
int cnt=0;
for(auto jt : S1) cnt+=uf.Union(jt.first, jt.second);
for(auto jt : E2) if(jt.second<=V[it].x && !binary_search(S2.begin(), S2.end(), 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; vector<pii> 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.push_back({V[p].x, V[p].y});
}
sort(S2.begin(), S2.end());
int cnt=0;
for(auto jt : S1) cnt+=uf.Union(jt.first, jt.second);
for(auto jt : E2) if(jt.first>V[it].x && !binary_search(S2.begin(), S2.end(), 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:125: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 |
19 ms |
896 KB |
Output is correct |
2 |
Correct |
16 ms |
640 KB |
Output is correct |
3 |
Correct |
15 ms |
640 KB |
Output is correct |
4 |
Correct |
24 ms |
640 KB |
Output is correct |
5 |
Correct |
279 ms |
1016 KB |
Output is correct |
6 |
Correct |
434 ms |
1148 KB |
Output is correct |
7 |
Correct |
11 ms |
768 KB |
Output is correct |
8 |
Correct |
19 ms |
640 KB |
Output is correct |
9 |
Correct |
280 ms |
1016 KB |
Output is correct |
10 |
Correct |
387 ms |
1016 KB |
Output is correct |
11 |
Correct |
463 ms |
1440 KB |
Output is correct |
12 |
Correct |
470 ms |
1356 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
142 ms |
5880 KB |
Output is correct |
2 |
Correct |
152 ms |
5856 KB |
Output is correct |
3 |
Correct |
3241 ms |
11488 KB |
Output is correct |
4 |
Correct |
144 ms |
5880 KB |
Output is correct |
5 |
Correct |
4610 ms |
11388 KB |
Output is correct |
6 |
Correct |
556 ms |
6460 KB |
Output is correct |
7 |
Correct |
8052 ms |
17584 KB |
Output is correct |
8 |
Correct |
4247 ms |
11464 KB |
Output is correct |
9 |
Correct |
157 ms |
6648 KB |
Output is correct |
10 |
Correct |
159 ms |
6624 KB |
Output is correct |
11 |
Correct |
317 ms |
6808 KB |
Output is correct |
12 |
Correct |
5696 ms |
12172 KB |
Output is correct |
13 |
Correct |
6809 ms |
14632 KB |
Output is correct |
14 |
Correct |
8163 ms |
18664 KB |
Output is correct |
15 |
Correct |
7955 ms |
18560 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
140 ms |
5884 KB |
Output is correct |
2 |
Correct |
158 ms |
5880 KB |
Output is correct |
3 |
Correct |
152 ms |
5880 KB |
Output is correct |
4 |
Correct |
170 ms |
5880 KB |
Output is correct |
5 |
Correct |
234 ms |
6136 KB |
Output is correct |
6 |
Correct |
751 ms |
6484 KB |
Output is correct |
7 |
Correct |
8700 ms |
14876 KB |
Output is correct |
8 |
Correct |
11416 ms |
17828 KB |
Output is correct |
9 |
Correct |
161 ms |
6648 KB |
Output is correct |
10 |
Correct |
324 ms |
6776 KB |
Output is correct |
11 |
Correct |
12568 ms |
19064 KB |
Output is correct |
12 |
Correct |
12303 ms |
18928 KB |
Output is correct |
13 |
Correct |
12599 ms |
18656 KB |
Output is correct |
14 |
Correct |
12305 ms |
18708 KB |
Output is correct |
15 |
Correct |
12187 ms |
18772 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
19 ms |
896 KB |
Output is correct |
2 |
Correct |
16 ms |
640 KB |
Output is correct |
3 |
Correct |
15 ms |
640 KB |
Output is correct |
4 |
Correct |
24 ms |
640 KB |
Output is correct |
5 |
Correct |
279 ms |
1016 KB |
Output is correct |
6 |
Correct |
434 ms |
1148 KB |
Output is correct |
7 |
Correct |
11 ms |
768 KB |
Output is correct |
8 |
Correct |
19 ms |
640 KB |
Output is correct |
9 |
Correct |
280 ms |
1016 KB |
Output is correct |
10 |
Correct |
387 ms |
1016 KB |
Output is correct |
11 |
Correct |
463 ms |
1440 KB |
Output is correct |
12 |
Correct |
470 ms |
1356 KB |
Output is correct |
13 |
Correct |
142 ms |
5880 KB |
Output is correct |
14 |
Correct |
152 ms |
5856 KB |
Output is correct |
15 |
Correct |
3241 ms |
11488 KB |
Output is correct |
16 |
Correct |
144 ms |
5880 KB |
Output is correct |
17 |
Correct |
4610 ms |
11388 KB |
Output is correct |
18 |
Correct |
556 ms |
6460 KB |
Output is correct |
19 |
Correct |
8052 ms |
17584 KB |
Output is correct |
20 |
Correct |
4247 ms |
11464 KB |
Output is correct |
21 |
Correct |
157 ms |
6648 KB |
Output is correct |
22 |
Correct |
159 ms |
6624 KB |
Output is correct |
23 |
Correct |
317 ms |
6808 KB |
Output is correct |
24 |
Correct |
5696 ms |
12172 KB |
Output is correct |
25 |
Correct |
6809 ms |
14632 KB |
Output is correct |
26 |
Correct |
8163 ms |
18664 KB |
Output is correct |
27 |
Correct |
7955 ms |
18560 KB |
Output is correct |
28 |
Correct |
140 ms |
5884 KB |
Output is correct |
29 |
Correct |
158 ms |
5880 KB |
Output is correct |
30 |
Correct |
152 ms |
5880 KB |
Output is correct |
31 |
Correct |
170 ms |
5880 KB |
Output is correct |
32 |
Correct |
234 ms |
6136 KB |
Output is correct |
33 |
Correct |
751 ms |
6484 KB |
Output is correct |
34 |
Correct |
8700 ms |
14876 KB |
Output is correct |
35 |
Correct |
11416 ms |
17828 KB |
Output is correct |
36 |
Correct |
161 ms |
6648 KB |
Output is correct |
37 |
Correct |
324 ms |
6776 KB |
Output is correct |
38 |
Correct |
12568 ms |
19064 KB |
Output is correct |
39 |
Correct |
12303 ms |
18928 KB |
Output is correct |
40 |
Correct |
12599 ms |
18656 KB |
Output is correct |
41 |
Correct |
12305 ms |
18708 KB |
Output is correct |
42 |
Correct |
12187 ms |
18772 KB |
Output is correct |
43 |
Correct |
6590 ms |
11512 KB |
Output is correct |
44 |
Correct |
10915 ms |
17700 KB |
Output is correct |
45 |
Correct |
6944 ms |
11720 KB |
Output is correct |
46 |
Correct |
11225 ms |
17584 KB |
Output is correct |
47 |
Correct |
165 ms |
6648 KB |
Output is correct |
48 |
Correct |
166 ms |
6652 KB |
Output is correct |
49 |
Correct |
392 ms |
6776 KB |
Output is correct |
50 |
Correct |
1813 ms |
7808 KB |
Output is correct |
51 |
Correct |
7917 ms |
12172 KB |
Output is correct |
52 |
Correct |
9841 ms |
13216 KB |
Output is correct |
53 |
Correct |
10297 ms |
13476 KB |
Output is correct |
54 |
Correct |
10626 ms |
14636 KB |
Output is correct |
55 |
Correct |
10889 ms |
14688 KB |
Output is correct |
56 |
Correct |
12156 ms |
15792 KB |
Output is correct |
57 |
Correct |
12510 ms |
17504 KB |
Output is correct |
58 |
Correct |
11899 ms |
17624 KB |
Output is correct |
59 |
Correct |
11897 ms |
18728 KB |
Output is correct |
60 |
Correct |
12134 ms |
19048 KB |
Output is correct |