# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
27128 | top34051 | Amusement Park (JOI17_amusement_park) | C++14 | 172 ms | 68212 KiB |
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 "Joi.h"
#include<bits/stdc++.h>
using namespace std;
int cnt;
int bit[10005];
int val[65];
bool vis[10005];
bool ok[10005];
vector<int> from[10005];
set<int> st;
set<int> p[10005];
set<int> leaf[10005];
queue<int> q;
void dfs(int x) {
int i;
if(cnt>=60) return ;
ok[x] = 1;
bit[x] = cnt++;
for(i=0;i<from[x].size();i++) {
if(!bit[from[x][i]] && cnt<60) {
ok[x] = 0;
dfs(from[x][i]);
}
}
}
void give(int x,int y) {
int i,k;
set<int>::iterator it;
for(it=leaf[y].begin();it!=leaf[y].end();it++) if(*it!=y) k = *it;
bit[x] = bit[k];
p[x] = p[y]; leaf[x] = leaf[y];
p[x].erase(k); p[x].insert(k);
leaf[x].erase(k); leaf[x].insert(k);
}
void Joi(int N, int M, int A[], int B[], long long X, int T) {
int i,j,x,y;
for(i=0;i<M;i++) from[A[i]].push_back(B[i]), from[B[i]].push_back(A[i]);
//Build graph
dfs(0);
//All nodes
st.clear();
for(i=0;i<N;i++) if(bit[i]) st.insert(i);
for(i=0;i<N;i++) if(bit[i]) p[i] = st;
//All leaves
st.clear();
for(i=0;i<N;i++) if(bit[i] && ok[i]) st.insert(i);
for(i=0;i<N;i++) if(bit[i]) leaf[i] = st;
//BFS
for(i=0;i<N;i++) if(bit[i]) vis[i] = 1, q.push(i);
while(!q.empty()) {
x = q.front(); q.pop();
for(i=0;i<from[x].size();i++) {
y = from[x][i];
if(!vis[y]) {
vis[y] = 1;
give(y,x);
q.push(y);
}
}
}
//Assign
for(i=1;i<=60;i++) val[i] = X&1, X/=2;
for(i=0;i<N;i++) MessageBoard(i, val[bit[i]]);
}
#include "Ioi.h"
#include<bits/stdc++.h>
using namespace std;
int cnt;
int bit[10005];
int val[65];
bool vis[10005];
bool ok[10005];
vector<int> from[10005];
set<int> st;
set<int> p[10005];
set<int> leaf[10005];
queue<int> q;
void dfs(int x) {
int i;
if(cnt>=60) return ;
ok[x] = 1;
bit[x] = cnt++;
for(i=0;i<from[x].size();i++) {
if(!bit[from[x][i]] && cnt<60) {
ok[x] = 0;
dfs(from[x][i]);
}
}
}
void give(int x,int y) {
int i,k;
set<int>::iterator it;
for(it=leaf[y].begin();it!=leaf[y].end();it++) if(*it!=y) k = *it;
bit[x] = bit[k];
p[x] = p[y]; leaf[x] = leaf[y];
p[x].erase(k); p[x].insert(k);
leaf[x].erase(k); leaf[x].insert(k);
}
void go(int x,int last,int P) {
int i;
for(i=0;i<from[x].size();i++) if(p[P].find(from[x][i])!=p[P].end()) val[from[x][i]] = Move(from[x][i]), go(from[x][i],x,P);
if(last!=-1) val[last] = Move(last);
}
long long Ioi(int N, int M, int A[], int B[], int P, int V, int T) {
int i,j,x,y;
long long ans;
set<int>::iterator it;
for(i=0;i<M;i++) from[A[i]].push_back(B[i]), from[B[i]].push_back(A[i]);
//Build graph
dfs(0);
//All nodes
st.clear();
for(i=0;i<N;i++) if(bit[i]) st.insert(i);
for(i=0;i<N;i++) if(bit[i]) p[i] = st;
//All leaves
st.clear();
for(i=0;i<N;i++) if(bit[i] && ok[i]) st.insert(i);
for(i=0;i<N;i++) if(bit[i]) leaf[i] = st;
//BFS
for(i=0;i<N;i++) if(bit[i]) vis[i] = 1, q.push(i);
while(!q.empty()) {
x = q.front(); q.pop();
for(i=0;i<from[x].size();i++) {
y = from[x][i];
if(!vis[y]) {
vis[y] = 1;
give(y,x);
q.push(y);
}
}
}
//Walk
go(P,-1,P);
//Answer
ans = 0;
for(it=p[P].begin();it!=p[P].end();it++) ans += (1<<(*it-1)) * val[*it];
return ans;
}
Compilation message (stderr)
# | 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... |