This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define sz(v) ((int)(v).size())
#define all(v) (v).begin(), (v).end()
using namespace std;
using lint = long long;
using pi = pair<int, int>;
const int MAXN = 600005;
struct disj{
int pa[MAXN];
void init(){
iota(pa, pa + MAXN, 0);
}
int find(int x){
return pa[x] = (pa[x] == x ? x : find(pa[x]));
}
bool uni(int p, int q){
p = find(p);
q = find(q);
if(p == q) return 0;
pa[q] = p; return 1;
}
}disj;
vector<int> bycmp[MAXN];
set<int> keys[MAXN];
set<pi> gph[2][MAXN];
int comp[MAXN], nxt[MAXN];
int idx[MAXN], sz[MAXN];
int find(int x){
return comp[x] = (comp[x] == x ? x : find(comp[x]));
}
void merge_to(int u, int v){
u = find(u);
if(u == v) return;
comp[u] = v;
int ov = v;
if(sz[u] > sz[v]) swap(u, v);
sz[v] += sz[u];
for(auto &i : keys[idx[u]]){
if(keys[idx[v]].find(i) == keys[idx[v]].end()){
keys[idx[v]].insert(i);
auto it = gph[0][idx[v]].lower_bound(pi(i, -1));
while(it != gph[0][idx[v]].end() && it->first == i){
gph[1][idx[v]].insert(*it);
it = gph[0][idx[v]].erase(it);
}
}
}
for(auto &i : gph[1][idx[u]]) gph[1][idx[v]].insert(i);
for(auto &[c, d] : gph[0][idx[u]]){
if(keys[idx[v]].find(c) != keys[idx[v]].end()){
gph[1][idx[v]].emplace(c, d);
}
else gph[0][idx[v]].emplace(c, d);
}
keys[idx[u]].clear();
gph[0][idx[u]].clear();
gph[1][idx[u]].clear();
idx[ov] = idx[v];
}
std::vector<int> find_reachable(std::vector<int> r, std::vector<int> u, std::vector<int> v, std::vector<int> c) {
int n = sz(r);
for(int i = 0; i < n; i++) keys[i].insert(r[i]);
for(int i = 0; i < sz(u); i++){
gph[c[i] == r[u[i]]][u[i]].emplace(c[i], v[i]);
gph[c[i] == r[v[i]]][v[i]].emplace(c[i], u[i]);
}
disj.init();
iota(idx, idx + MAXN, 0);
fill(sz, sz + MAXN, 1);
iota(comp, comp + MAXN, 0);
vector<int> ans(n, 1e9);
for(int i = 0; i < n; i++){
nxt[i] = i;
if(sz(gph[1][i])) nxt[i] = gph[1][i].begin()->second;
}
if(count(all(ans), 1) != 0) return ans;
for(int i = 0; i < n; i++){
if(find(i) != i) continue;
if(i == find(nxt[i])) continue;
if(!disj.uni(i, nxt[i])){
for(int j = find(nxt[i]); find(j) != find(n); j = find(nxt[j])){
merge_to(j, n);
}
disj.uni(i, n);
auto it = gph[1][idx[n]].begin();
nxt[n] = n;
while(it != gph[1][idx[n]].end()){
int k, v;
tie(k, v) = *it;
if(find(v) == find(n)) it = gph[1][idx[n]].erase(it);
else{
nxt[n] = find(v);
break;
}
}
n++;
}
}
for(int j = 0; j < sz(ans); j++){
bycmp[find(j)].push_back(j);
}
fill(all(ans), 1e9);
for(int j = 0; j < n; j++){
if(sz(bycmp[j]) && find(nxt[j]) == find(j)){
for(auto &i : bycmp[j]){
if(i < sz(ans)) ans[i] = sz(bycmp[j]);
}
}
}
int val = *min_element(all(ans));
for(auto &i : ans){
i = (i == val);
}
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |