# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
27137 | top34051 | Amusement Park (JOI17_amusement_park) | C++14 | 165 ms | 69004 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "Joi.h"
#include<bits/stdc++.h>
using namespace std;
int cnt1;
int bit1[10005];
int val1[65];
bool vis1[10005];
bool ok1[10005];
vector<int> from1[10005];
set<int> st1;
set<int> p1[10005];
set<int> leaf1[10005];
queue<int> q1;
void dfs1(int x) {
int i;
if(cnt1>=60) return ;
ok1[x] = 1;
bit1[x] = cnt1++;
for(i=0;i<from1[x].size();i++) {
if(bit1[from1[x][i]]==-1 && cnt1<60) {
ok1[x] = 0;
dfs1(from1[x][i]);
}
}
}
void give1(int x,int y) {
int i,k;
set<int>::iterator it;
for(it=leaf1[y].begin();it!=leaf1[y].end();it++) if(*it!=y) k = *it;
bit1[x] = bit1[k];
p1[x] = p1[y]; leaf1[x] = leaf1[y];
p1[x].erase(k); p1[x].insert(x);
leaf1[x].erase(k); leaf1[x].insert(x);
}
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++) from1[A[i]].push_back(B[i]), from1[B[i]].push_back(A[i]);
//Build graph
memset(bit1,-1,sizeof(bit1));
dfs1(0);
//All nodes
st1.clear();
for(i=0;i<N;i++) if(bit1[i]!=-1) st1.insert(i);
for(i=0;i<N;i++) if(bit1[i]!=-1) p1[i] = st1;
//All leaves
st1.clear();
for(i=0;i<N;i++) if(bit1[i]!=-1 && ok1[i]) st1.insert(i);
for(i=0;i<N;i++) if(bit1[i]!=-1) leaf1[i] = st1;
//BFS
for(i=0;i<N;i++) if(bit1[i]!=-1) vis1[i] = 1, q1.push(i);
while(!q1.empty()) {
x = q1.front(); q1.pop();
for(i=0;i<from1[x].size();i++) {
y = from1[x][i];
if(!vis1[y]) {
vis1[y] = 1;
give1(y,x);
q1.push(y);
}
}
}
//Assign
for(i=0;i<60;i++) val1[i] = X&1, X/=2;
for(i=0;i<N;i++) MessageBoard(i, val1[bit1[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]]==-1 && 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(x);
leaf[x].erase(k); leaf[x].insert(x);
}
void go(int x,int last,int P) {
int i;
vis[x] = 1;
for(i=0;i<from[x].size();i++) if(p[P].find(from[x][i])!=p[P].end() && !vis[from[x][i]]) 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
memset(bit,-1,sizeof(bit));
dfs(0);
//All nodes
st.clear();
for(i=0;i<N;i++) if(bit[i]!=-1) st.insert(i);
for(i=0;i<N;i++) if(bit[i]!=-1) p[i] = st;
//All leaves
st.clear();
for(i=0;i<N;i++) if(bit[i]!=-1 && ok[i]) st.insert(i);
for(i=0;i<N;i++) if(bit[i]!=-1) leaf[i] = st;
//BFS
for(i=0;i<N;i++) if(bit[i]!=-1) 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
memset(vis,0,sizeof(vis));
go(P,-1,P);
//Answer
ans = 0;
for(it=p[P].begin();it!=p[P].end();it++) ans += (long long)(1LL<<bit[*it]) * val[*it];
return ans;
}
컴파일 시 표준 에러 (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... |