#include "Joi.h"
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10000;
int dsu[MAXN];
int in[MAXN];
int tim=0;
vector<vector<int>> graph;
int pa[MAXN];
int Findset(int i){
if(dsu[i]<0){
return i;
}
int root=Findset(dsu[i]);
dsu[i]=root;
return root;
}
void unite(int u,int v){
u=Findset(u),v=Findset(v);
if(u==v){
return;
}
if(dsu[u]<dsu[v]){
swap(u,v);
}
dsu[v]+=dsu[u];
dsu[u]=v;
}
void setup(int u,int p){
pa[u]=p;
in[u]=tim;
tim++;
for(int v:graph[u]){
if(v!=p){
setup(v,u);
}
}
}
void buildtree(int a[],int b[],int n,int m){
graph.clear();
graph.resize(n);
tim=0;
for(int i=0;i<n;i++){
dsu[i]=-1,in[i]=0,pa[i]=0;
}
for(int i=0;i<m;i++){
if(Findset(a[i])!=Findset(b[i])){
unite(a[i],b[i]);
graph[a[i]].push_back(b[i]);
graph[b[i]].push_back(a[i]);
}
}
setup(0,-1);
}
void Joi(int n,int m,int a[],int b[],long long x,int t){
buildtree(a,b,n,m);
for(int i=0;i<n;i++){
if(x&(1LL<<(in[i]%60))){
MessageBoard(i,1);
}
else{
MessageBoard(i,0);
}
}
}
#include "Ioi.h"
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10000;
int dsu[MAXN];
int in[MAXN];
int tim=0;
vector<vector<int>> graph;
int pa[MAXN];
int Findset(int i){
if(dsu[i]<0){
return i;
}
int root=Findset(dsu[i]);
dsu[i]=root;
return root;
}
void unite(int u,int v){
u=Findset(u),v=Findset(v);
if(u==v){
return;
}
if(dsu[u]<dsu[v]){
swap(u,v);
}
dsu[v]+=dsu[u];
dsu[u]=v;
}
void setup(int u,int p){
pa[u]=p;
in[u]=tim;
tim++;
for(int v:graph[u]){
if(v!=p){
setup(v,u);
}
}
}
void buildtree(int a[],int b[],int n,int m){
graph.clear();
graph.resize(n);
tim=0;
for(int i=0;i<n;i++){
dsu[i]=-1,in[i]=0,pa[i]=0;
}
for(int i=0;i<m;i++){
if(Findset(a[i])!=Findset(b[i])){
unite(a[i],b[i]);
graph[a[i]].push_back(b[i]);
graph[b[i]].push_back(a[i]);
}
}
setup(0,-1);
}
long long x=-1;
int val[60];
int wri[MAXN];
void update(int k,int bit){
val[k]=bit;
bool flag=true;
for(int i=0;i<60;i++){
if(val[i]==-1){
flag=false;
break;
}
}
if(flag){
x=0;
for(int i=0;i<60;i++){
if(val[i]){
x^=(1LL<<i);
}
}
}
}
void DFS(int u,int p,char dir){
update(in[u]%60,wri[u]);
if(x!=-1){
return;
}
if(dir=='R'){
for(int i=(int)graph[u].size()-1;i>=0;i--){
int v=graph[u][i];
if(v!=p){
wri[v]=Move(v);
DFS(v,u,dir);
if(x!=-1){
return;
}
wri[u]=Move(u);
}
}
}
else{
for(int v:graph[u]){
if(v!=p){
wri[v]=Move(v);
DFS(v,u,dir);
if(x!=-1){
return;
}
wri[u]=Move(u);
}
}
}
}
long long Ioi(int n,int m,int a[],int b[],int u,int V,int t){
memset(val,-1,sizeof(val));
buildtree(a,b,n,m);
wri[u]=V;
int last=-1;
while(x==-1&&u!=-1){
update(in[u]%60,wri[u]);
if(x!=-1){
return x;
}
int pos=-1;
for(int i=0;i<graph[u].size();i++){
int v=graph[u][i];
if(v!=pa[u]&&v==last){
pos=i;
break;
}
}
for(int i=pos+1;i<graph[u].size();i++){
int v=graph[u][i];
if(v!=pa[u]){
wri[v]=Move(v);
DFS(v,u,'L');
if(x!=-1){
return x;
}
wri[u]=Move(u);
}
}
for(int i=0;i<pos;i++){
int v=graph[u][i];
if(v!=pa[u]){
wri[v]=Move(v);
DFS(v,u,'L');
if(x!=-1){
return x;
}
wri[u]=Move(u);
}
}
last=u;
u=pa[u];
if(u!=-1){
wri[u]=Move(u);
}
}
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... |