#include <bits/stdc++.h>
#include "collapse.h"
using namespace std;
template<class T, class U>
void ckmin(T &a, U b)
{
if (a > b) a = b;
}
template<class T, class U>
void ckmax(T &a, U b)
{
if (a < b) a = b;
}
#define MP make_pair
#define PB push_back
#define LB lower_bound
#define UB upper_bound
#define fi first
#define se second
#define FOR(i, a, b) for (auto i = (a); i < (b); i++)
#define FORD(i, a, b) for (auto i = (a) - 1; i >= (b); i--)
#define SZ(x) ((int) (x).size())
#define ALL(x) (x).begin(), (x).end()
#define INF 1000000007
#define LLINF 2696969696969696969
#define MAXN 100013
#define MAGIC 521
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpi;
typedef vector<pll> vpl;
int N, Q;
vi ans;
unordered_set<int> edges[MAXN], ins[MAXN], beg[MAXN];
vector<array<int, 4> > events;
vector<array<int, 4> > block;
bitset<MAXN> seen;
vi ord;
bool cmp(int a, int b)
{
return block[a][2] < block[b][2];
}
struct dsu
{
int dsu[MAXN], siz[MAXN];
void init()
{
FOR(i, 0, N)
{
dsu[i] = i;
siz[i] = 1;
}
}
int get(int u)
{
return (u == dsu[u] ? u : dsu[u] = get(dsu[u]));
}
bool merge(int u, int v)
{
u = get(u); v = get(v);
if (u == v) return false;
if (siz[u] > siz[v]) swap(u, v);
siz[v] += siz[u];
dsu[u] = v;
return true;
}
};
dsu D[2];
void proc()
{
seen.reset();
vi nodes;
FOR(i, 0, SZ(block))
{
if (block[i][1] == 2) continue;
if (!seen[block[i][2]])
{
nodes.PB(block[i][2]);
seen[block[i][2]] = true;
}
if (!seen[block[i][3]])
{
nodes.PB(block[i][3]);
seen[block[i][3]] = true;
}
}
D[0].init(); D[1].init();
FOR(i, 0, N)
{
beg[i] = edges[i];
}
FOR(i, 0, SZ(block))
{
if (block[i][1] == 1)
{
int u = block[i][2], v = block[i][3];
if (edges[v].find(u) != edges[v].end()) edges[v].erase(u);
}
}
for (int u : nodes)
{
for (int v : edges[u])
{
beg[v].erase(v);
}
}
int cp = -1, cc = 0;
ord.clear();
FOR(i, 0, SZ(block))
{
if (block[i][1] == 2) ord.PB(i);
}
sort(ALL(ord), cmp);
for (int idx : ord)
{
int t = block[idx][0], x = block[idx][2], qid = block[idx][3];
while(cp < x)
{
cp++; cc++;
for (int w : edges[cp]) if (D[0].merge(cp, w)) cc--;
}
int res = cc;
for (int u : nodes)
{
ins[u] = beg[u];
}
FOR(j, 0, SZ(block))
{
if (block[j][0] > t) break;
if (block[j][1] == 2) continue;
int u = block[j][2], v = block[j][3];
if (v > x) continue;
if (block[j][1] == 1)
{
if (ins[v].find(u) != ins[v].end()) ins[v].erase(u);
}
else
{
ins[v].insert(u);
}
}
for (int u : nodes)
{
if (u > x) continue;
int ve = D[0].get(u);
for (int w : ins[u])
{
if (D[1].merge(ve, D[0].get(w))) res--;
}
ins[u].clear();
}
for (int u : nodes)
{
int v = D[0].get(u);
D[1].dsu[v] = v; D[1].siz[v] = 1;
}
// cerr << res << endl;
ans[qid] += res;
}
for (int u : nodes)
{
for (int x : beg[u])
{
edges[u].insert(x);
}
}
FOR(i, 0, SZ(block))
{
if (block[i][1] == 2) continue;
int u = block[i][2], v = block[i][3];
if (block[i][1] == 1)
{
if (edges[v].find(u) != edges[v].end()) edges[v].erase(u);
}
else
{
edges[v].insert(u);
}
}
//build the set of edges now!
}
void solve()
{
//find # of cc's with value LESS THAN whatever
//sort all the queries in the block.
//after processing the block, the sets should store all active edges.
// FOR(i, 0, SZ(events))
// {
// assert(events[i][1] == 2 || events[i][2] < events[i][3]);
// }
for (int i = 0; i < SZ(events); i += MAGIC)
{
for (int j = i; j < SZ(events) && j < i + MAGIC; j++)
{
block.PB(events[j]);
}
proc();
block.clear();
}
}
vi simulateCollapse(int n, vi t, vi x, vi y, vi w, vi p)
{
N = n; Q = SZ(w);
ans.resize(Q);
FOR(i, 0, SZ(t))
{
if (x[i] > y[i]) swap(x[i], y[i]);
events.PB({i, t[i], x[i], y[i]});
}
FOR(i, 0, Q)
{
events.PB({w[i], 2, p[i], i});
}
sort(ALL(events));
FOR(i, 0, SZ(events))
{
events[i][0] = i;
}
// cerr << "SOLVE\n";
solve();
FOR(i, 0, N)
{
edges[i].clear();
ins[i].clear();
}
for (auto &e : events)
{
if (e[1] == 2)
{
e[2] = N - 2 - e[2];
}
else
{
e[2] = N - 1 - e[2];
e[3] = N - 1 - e[3];
swap(e[2], e[3]);
}
}
// cerr << "SOLVE\n";
solve();
return ans;
//event: disconnect u -> v, connect u -> v, ask qid x pos y: so you store time, typ, who it happens to
return ans;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
28 ms |
17400 KB |
Output is correct |
2 |
Correct |
25 ms |
17076 KB |
Output is correct |
3 |
Correct |
29 ms |
17144 KB |
Output is correct |
4 |
Correct |
31 ms |
17144 KB |
Output is correct |
5 |
Correct |
57 ms |
17400 KB |
Output is correct |
6 |
Correct |
1194 ms |
17912 KB |
Output is correct |
7 |
Correct |
27 ms |
17144 KB |
Output is correct |
8 |
Correct |
28 ms |
17272 KB |
Output is correct |
9 |
Correct |
211 ms |
17532 KB |
Output is correct |
10 |
Correct |
299 ms |
17656 KB |
Output is correct |
11 |
Correct |
481 ms |
18012 KB |
Output is correct |
12 |
Correct |
797 ms |
18356 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
136 ms |
20972 KB |
Output is correct |
2 |
Correct |
155 ms |
20972 KB |
Output is correct |
3 |
Correct |
720 ms |
25292 KB |
Output is correct |
4 |
Correct |
156 ms |
20844 KB |
Output is correct |
5 |
Correct |
2056 ms |
25320 KB |
Output is correct |
6 |
Correct |
7671 ms |
21668 KB |
Output is correct |
7 |
Execution timed out |
15083 ms |
28596 KB |
Time limit exceeded |
8 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
139 ms |
20844 KB |
Output is correct |
2 |
Correct |
148 ms |
20972 KB |
Output is correct |
3 |
Correct |
155 ms |
20972 KB |
Output is correct |
4 |
Correct |
159 ms |
20876 KB |
Output is correct |
5 |
Correct |
288 ms |
20972 KB |
Output is correct |
6 |
Correct |
8587 ms |
21544 KB |
Output is correct |
7 |
Execution timed out |
15082 ms |
27084 KB |
Time limit exceeded |
8 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
28 ms |
17400 KB |
Output is correct |
2 |
Correct |
25 ms |
17076 KB |
Output is correct |
3 |
Correct |
29 ms |
17144 KB |
Output is correct |
4 |
Correct |
31 ms |
17144 KB |
Output is correct |
5 |
Correct |
57 ms |
17400 KB |
Output is correct |
6 |
Correct |
1194 ms |
17912 KB |
Output is correct |
7 |
Correct |
27 ms |
17144 KB |
Output is correct |
8 |
Correct |
28 ms |
17272 KB |
Output is correct |
9 |
Correct |
211 ms |
17532 KB |
Output is correct |
10 |
Correct |
299 ms |
17656 KB |
Output is correct |
11 |
Correct |
481 ms |
18012 KB |
Output is correct |
12 |
Correct |
797 ms |
18356 KB |
Output is correct |
13 |
Correct |
136 ms |
20972 KB |
Output is correct |
14 |
Correct |
155 ms |
20972 KB |
Output is correct |
15 |
Correct |
720 ms |
25292 KB |
Output is correct |
16 |
Correct |
156 ms |
20844 KB |
Output is correct |
17 |
Correct |
2056 ms |
25320 KB |
Output is correct |
18 |
Correct |
7671 ms |
21668 KB |
Output is correct |
19 |
Execution timed out |
15083 ms |
28596 KB |
Time limit exceeded |
20 |
Halted |
0 ms |
0 KB |
- |