#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 = 1000;
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;
^
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
15 ms |
896 KB |
Output is correct |
2 |
Correct |
9 ms |
640 KB |
Output is correct |
3 |
Correct |
12 ms |
640 KB |
Output is correct |
4 |
Correct |
12 ms |
640 KB |
Output is correct |
5 |
Correct |
100 ms |
896 KB |
Output is correct |
6 |
Correct |
228 ms |
1144 KB |
Output is correct |
7 |
Correct |
9 ms |
640 KB |
Output is correct |
8 |
Correct |
10 ms |
640 KB |
Output is correct |
9 |
Correct |
141 ms |
1016 KB |
Output is correct |
10 |
Correct |
227 ms |
1016 KB |
Output is correct |
11 |
Correct |
229 ms |
1272 KB |
Output is correct |
12 |
Correct |
240 ms |
1272 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
99 ms |
6088 KB |
Output is correct |
2 |
Correct |
107 ms |
5880 KB |
Output is correct |
3 |
Correct |
2154 ms |
11364 KB |
Output is correct |
4 |
Correct |
107 ms |
5880 KB |
Output is correct |
5 |
Correct |
3227 ms |
11564 KB |
Output is correct |
6 |
Correct |
363 ms |
6448 KB |
Output is correct |
7 |
Correct |
7349 ms |
17828 KB |
Output is correct |
8 |
Correct |
3096 ms |
11452 KB |
Output is correct |
9 |
Correct |
123 ms |
6648 KB |
Output is correct |
10 |
Correct |
127 ms |
6660 KB |
Output is correct |
11 |
Correct |
208 ms |
6776 KB |
Output is correct |
12 |
Correct |
3846 ms |
12156 KB |
Output is correct |
13 |
Correct |
5793 ms |
14728 KB |
Output is correct |
14 |
Correct |
7994 ms |
18716 KB |
Output is correct |
15 |
Correct |
7239 ms |
18788 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
109 ms |
6008 KB |
Output is correct |
2 |
Correct |
105 ms |
5880 KB |
Output is correct |
3 |
Correct |
118 ms |
5880 KB |
Output is correct |
4 |
Correct |
114 ms |
5880 KB |
Output is correct |
5 |
Correct |
164 ms |
6008 KB |
Output is correct |
6 |
Correct |
457 ms |
6512 KB |
Output is correct |
7 |
Correct |
6449 ms |
14888 KB |
Output is correct |
8 |
Correct |
9874 ms |
17688 KB |
Output is correct |
9 |
Correct |
142 ms |
6648 KB |
Output is correct |
10 |
Correct |
236 ms |
6776 KB |
Output is correct |
11 |
Correct |
9941 ms |
18832 KB |
Output is correct |
12 |
Correct |
10712 ms |
19052 KB |
Output is correct |
13 |
Correct |
10076 ms |
19048 KB |
Output is correct |
14 |
Correct |
10513 ms |
18992 KB |
Output is correct |
15 |
Correct |
9801 ms |
18980 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
15 ms |
896 KB |
Output is correct |
2 |
Correct |
9 ms |
640 KB |
Output is correct |
3 |
Correct |
12 ms |
640 KB |
Output is correct |
4 |
Correct |
12 ms |
640 KB |
Output is correct |
5 |
Correct |
100 ms |
896 KB |
Output is correct |
6 |
Correct |
228 ms |
1144 KB |
Output is correct |
7 |
Correct |
9 ms |
640 KB |
Output is correct |
8 |
Correct |
10 ms |
640 KB |
Output is correct |
9 |
Correct |
141 ms |
1016 KB |
Output is correct |
10 |
Correct |
227 ms |
1016 KB |
Output is correct |
11 |
Correct |
229 ms |
1272 KB |
Output is correct |
12 |
Correct |
240 ms |
1272 KB |
Output is correct |
13 |
Correct |
99 ms |
6088 KB |
Output is correct |
14 |
Correct |
107 ms |
5880 KB |
Output is correct |
15 |
Correct |
2154 ms |
11364 KB |
Output is correct |
16 |
Correct |
107 ms |
5880 KB |
Output is correct |
17 |
Correct |
3227 ms |
11564 KB |
Output is correct |
18 |
Correct |
363 ms |
6448 KB |
Output is correct |
19 |
Correct |
7349 ms |
17828 KB |
Output is correct |
20 |
Correct |
3096 ms |
11452 KB |
Output is correct |
21 |
Correct |
123 ms |
6648 KB |
Output is correct |
22 |
Correct |
127 ms |
6660 KB |
Output is correct |
23 |
Correct |
208 ms |
6776 KB |
Output is correct |
24 |
Correct |
3846 ms |
12156 KB |
Output is correct |
25 |
Correct |
5793 ms |
14728 KB |
Output is correct |
26 |
Correct |
7994 ms |
18716 KB |
Output is correct |
27 |
Correct |
7239 ms |
18788 KB |
Output is correct |
28 |
Correct |
109 ms |
6008 KB |
Output is correct |
29 |
Correct |
105 ms |
5880 KB |
Output is correct |
30 |
Correct |
118 ms |
5880 KB |
Output is correct |
31 |
Correct |
114 ms |
5880 KB |
Output is correct |
32 |
Correct |
164 ms |
6008 KB |
Output is correct |
33 |
Correct |
457 ms |
6512 KB |
Output is correct |
34 |
Correct |
6449 ms |
14888 KB |
Output is correct |
35 |
Correct |
9874 ms |
17688 KB |
Output is correct |
36 |
Correct |
142 ms |
6648 KB |
Output is correct |
37 |
Correct |
236 ms |
6776 KB |
Output is correct |
38 |
Correct |
9941 ms |
18832 KB |
Output is correct |
39 |
Correct |
10712 ms |
19052 KB |
Output is correct |
40 |
Correct |
10076 ms |
19048 KB |
Output is correct |
41 |
Correct |
10513 ms |
18992 KB |
Output is correct |
42 |
Correct |
9801 ms |
18980 KB |
Output is correct |
43 |
Correct |
4455 ms |
11400 KB |
Output is correct |
44 |
Correct |
8966 ms |
17636 KB |
Output is correct |
45 |
Correct |
4738 ms |
11720 KB |
Output is correct |
46 |
Correct |
9666 ms |
17940 KB |
Output is correct |
47 |
Correct |
128 ms |
6652 KB |
Output is correct |
48 |
Correct |
131 ms |
6648 KB |
Output is correct |
49 |
Correct |
240 ms |
6776 KB |
Output is correct |
50 |
Correct |
1111 ms |
7988 KB |
Output is correct |
51 |
Correct |
5303 ms |
12280 KB |
Output is correct |
52 |
Correct |
7272 ms |
13520 KB |
Output is correct |
53 |
Correct |
7355 ms |
13284 KB |
Output is correct |
54 |
Correct |
8302 ms |
14848 KB |
Output is correct |
55 |
Correct |
8170 ms |
15156 KB |
Output is correct |
56 |
Correct |
9267 ms |
15896 KB |
Output is correct |
57 |
Correct |
9693 ms |
17432 KB |
Output is correct |
58 |
Correct |
9869 ms |
17724 KB |
Output is correct |
59 |
Correct |
9615 ms |
18684 KB |
Output is correct |
60 |
Correct |
10537 ms |
18780 KB |
Output is correct |