#include "Joi.h"
#include <iostream>
#include <vector>
using namespace std;
int vis_Joi[10010], ord_Joi[10010], cnt_Joi;
vector<int> edge_Joi[10010];
void dfs_Joi(int u) {
vis_Joi[u] = 1;
ord_Joi[u] = cnt_Joi++;
for (int i = 0; i < edge_Joi[u].size(); i++) if (!vis_Joi[edge_Joi[u][i]]) dfs_Joi(edge_Joi[u][i]);
}
void Joi(int n, int m, int A[], int B[], long long X, int T) {
for (int i = 0; i < m; i++) {
edge_Joi[A[i]].push_back(B[i]);
edge_Joi[B[i]].push_back(A[i]);
}
dfs_Joi(0);
for (int i = 0; i < n; i++) MessageBoard(i,((X>>(ord_Joi[i]%60)))%2);
}
#include "Ioi.h"
#include <iostream>
#include <vector>
using namespace std;
long long vis[10010], ord[10010], cnt, p[10010], ans[70], hv[10010][70], ok[70], ord2[10010], uu;
vector<long long> edge[10010], adj[10010], path, tmp, viss;
bool can, done;
void dfs(int u) {
vis[u] = 1;
ord[u] = cnt++;
hv[u][ord[u]%60] = 1;
for (int i = 0; i < edge[u].size(); i++) {
if (!vis[edge[u][i]]) {
adj[u].push_back(edge[u][i]);
p[edge[u][i]] = u;
dfs(edge[u][i]);
for (int j = 0; j < 60; j++) hv[u][j] |= hv[edge[u][i]][j];
}
}
ord2[u] = cnt;
}
bool check(int u) {
for (int i = 0; i < 60; i++) if (!hv[u][i]) return 0;
return 1;
}
void dfs1(int u) {
for (int i = 0; i < 60; i++) if (!ok[i] && hv[u][i]) goto skip;
return;
skip:;
ok[ord[u]%60] = vis[u] = 1;
for (int i = 0; i < adj[u].size(); i++) dfs1(adj[u][i]);
}
void dfs2(int u, int lst, int need_check) {
if (!can) return;
if (need_check && (u != uu) && (ord[u] <= ord[lst]) && (ord2[lst] <= ord2[u])) {
can = 0;
return;
}
tmp.push_back(u);
vis[u] = 0;
for (int i = 0; i < adj[u].size(); i++) {
if ((vis[adj[u][i]]) && (!((ord[adj[u][i]] <= ord[lst]) && (ord2[lst] <= ord2[adj[u][i]])))) {
dfs2(adj[u][i],lst,0);
tmp.push_back(u);
}
}
for (int i = 0; i < adj[u].size(); i++) {
if ((vis[adj[u][i]]) && ((ord[adj[u][i]] <= ord[lst]) && (ord2[lst] <= ord2[adj[u][i]]))) {
dfs2(adj[u][i],lst,0);
tmp.push_back(u);
}
}
if ((p[u] != -1) && (vis[p[u]])) dfs2(p[u],lst,1);
}
long long Ioi(int n, int m, int A[], int B[], int P, int V, int T) {
for (int i = 0; i < m; i++) {
edge[A[i]].push_back(B[i]);
edge[B[i]].push_back(A[i]);
}
for (int i = 0; i < n; i++) p[i] = -1;
dfs(0);
int u = P;
for (int i = 0; i < n; i++) vis[i] = 0;
ok[ord[u]%60] = vis[u] = 1;
while (!check(u)) u = p[u], ok[ord[u]%60] = vis[u] = 1;
uu = u;
dfs1(u);
for (int i = 0; i < n; i++) if (vis[i]) viss.push_back(i);
for (int i = 0; i < n; i++) {
if (vis[i]) {
cnt = 0;
for (int j = 0; j < adj[i].size(); j++) cnt += vis[adj[i][j]];
if (p[i] != -1) cnt += vis[p[i]];
if (cnt != 1) continue;
tmp.clear();
can = 1; done = 0;
dfs2(P,i,1);
for (int j = 0; j < viss.size(); j++) vis[viss[j]] = 1;
while (tmp.back() != i) tmp.pop_back();
if (can && (path.empty() || (tmp.size() < path.size()))) path = tmp;
}
}
u = P;
ans[ord[u]%60] = V;
for (int i = 0; i < path.size(); i++) {
if (u == path[i]) continue;
u = path[i];
ans[ord[u]%60] = Move(u);
}
long long x = 0;
for (int i = 0; i < 60; i++) x += (ans[i]<<i);
return x;
}
# | 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... |