#include "Joi.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = (int)1e5 + 12, b = 60;
mt19937 rng1(123321);
vector<int> g1[N], G1[N];
int tin1[N], timer1, va[N];
bool vis1[N], ok1[N];
ll x;
void build1(int n) {
set<int> cur;
function<void(int)> dd = [&](int v) {
vis1[v] = 1;
for(int to : g1[v]) {
if(!vis1[to]) {
dd(to);
G1[v].push_back(to);
}
}
};
function<void(int)> dfs = [&](int v){
vis1[v] = 1;
cur.insert(v);
if((int)cur.size() == b) return;
for(int to : G1[v]) {
if(!vis1[to]) {
dfs(to);
if((int)cur.size() == b) return;
}
}
};
auto find = [&]() {
for(int i : cur) {
int col = 0;
for(int to : g1[i]) {
if(ok1[to]) {
col++;
}
}
assert(col);
if(col == 1) return i;
}
exit(-1);
};
function<void(int, int)> go = [&](int v, int pr) {
for(int to : G1[v]) {
int del = -1;
if(!ok1[to]) {
del = find();
cur.erase(del);
cur.insert(to);
va[v] = va[del];
}
go(to, v);
if(!ok1[to]) {
cur.insert(del);
}
}
};
dd(0);
for(int i = 0; i < n; i++) {
vis1[i] = 0;
}
dfs(0);
auto it = (cur.begin());
for(int i = 0; i < b; i++) {
ok1[(*it)] = 1;
va[(*it)] = i;
it++;
}
go(0, -1);
for(int i = 0; i < n; i++) {
MessageBoard(i, ((x >> va[i]) & 1));
}
}
void Joi(int n, int m, int A[], int B[], long long X, int T) {
x = X;
for(int i = 0; i < m; i++) {
g1[A[i]].push_back(B[i]);
g1[B[i]].push_back(A[i]);
}
for(int i = 0; i < n; i++) {
sort(g1[i].begin(), g1[i].end());
}
build1(n);
}
#include "Ioi.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = (int)1e5 + 12, b = 60;
mt19937 rng(123321);
ll d[N], mxd[N], pr[N], timer, sz[N];
vector<int> g[N], G[N];
int tin[N], bt[N], tout[N], val[N];
bool vis[N], ok[N];
set<int> st[N];
void build(int n) {
set<int> cur;
function<void(int)> dd = [&](int v) {
vis[v] = 1;
for(int to : g[v]) {
if(!vis[to]) {
pr[to] = v;
dd(to);
G[v].push_back(to);
}
}
};
function<void(int)> dfs = [&](int v){
vis[v] = 1;
cur.insert(v);
if((int)cur.size() == b) return;
for(int to : G[v]) {
if(!vis[to]) {
dfs(to);
if((int)cur.size() == b) return;
}
}
};
auto find = [&]() {
for(int i : cur) {
int col = 0;
for(int to : g[i]) {
if(ok[to]) {
col++;
}
}
assert(col);
if(col == 1) return i;
}
exit(-1);
};
function<void(int, int)> go = [&](int v, int pr) {
for(int to : G[v]) {
int del = -1;
if(!ok[to]) {
// cout << to << "\n";
del = find();
ok[del] = 0;
cur.erase(del);
cur.insert(to);
val[v] = val[del];
st[to] = cur;
}
go(to, v);
if(!ok[to]) {
ok[del] = 1;
cur.insert(del);
}
}
};
dd(0);
for(int i = 0; i < n; i++) {
vis[i] = 0;
}
dfs(0);
auto it = (cur.begin());
for(int i = 0; i < b; i++) {
st[(*it)] = cur;
ok[(*it)] = 1;
val[(*it)] = i;
it++;
}
go(0, -1);
}
long long Ioi(int n, int m, int A[], int B[], int P, int V, int T) {
memset(pr, -1, sizeof(pr));
for(int i = 0; i < m; i++) {
g[A[i]].push_back(B[i]);
g[B[i]].push_back(A[i]);
}
for(int i = 0; i < n; i++) {
sort(g[i].begin(), g[i].end());
}
build(n);
function<void(int, int, int)> dfs = [&](int v, int pr, int f) {
bt[val[v]] = f;
for(int to : G[v]) {
if(ok[to] && to != pr) {
dfs(to, v, Move(to));
}
}
if(pr != -1 && ok[pr]) {
Move(pr);
}
};
for(int i = 0; i < n; i++) {
ok[i] = 0;
if(pr[i] != -1) {
G[i].push_back(pr[i]);
}
}
for(int j : st[P]) {
ok[j] = 1;
}
dfs(P, -1, V);
ll res = 0;
for(int i = 0; i < b; i++) {
if(bt[i]) res += (1ll << i);
}
return res;
}
# | 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... |