Submission #533737

#TimeUsernameProblemLanguageResultExecution timeMemory
53373779brueDungeon 2 (JOI16_dungeon2)C++14
86 / 100
26 ms7792 KiB
#include "dungeon2.h" #include <bits/stdc++.h> using namespace std; int n; int deg[40002]; int par[40002], prvNum[40002]; int idx[40002], origCnt; int origLst[40002]; vector<int> link[40002]; bool isOriginal[40002]; int num[40002]; void dfs(int x, int parNum = -1){ prvNum[x] = LastRoad(); deg[x] = NumberOfRoads(); if(Color() == 2){ /// 이미 방문한 정점 Move(LastRoad(), 2); return; } isOriginal[x] = 1; idx[x] = ++origCnt; origLst[origCnt] = x; for(int i=1; i<=deg[x]; i++){ if(i == prvNum[x]){ par[x] = parNum; link[x].push_back(parNum); continue; } Move(i, 2); link[x].push_back(++n); dfs(n, x); } if(prvNum[x] > 0) Move(prvNum[x], 2); } int getBit(int x, int y){ while(y--) x/=3; return x%3+1; } int pow3[] = {1, 3, 9, 27, 81, 243}; void dfs2(int x, int bit){ if(isOriginal[x]){ /// 고유한 정점 num[x] = x; for(int i=1; i<=deg[x]; i++){ if(i==prvNum[x]) continue; Move(i, getBit(idx[x], bit)); dfs2(link[x][i], bit); } if(prvNum[x] > 0) Move(prvNum[x], 2); } else{ num[x] += (Color() - 1) * pow3[bit]; Move(LastRoad(), Color()); } } int dist[1002][1002]; int ans[1002]; void Inspect(int R){ for(int i=0; i<=40000; i++) link[i].push_back(0); dfs(++n); for(int i=0; i<6; i++){ dfs2(1, i); } for(int i=0; i<=1000; i++) for(int j=0; j<=1000; j++) if(i!=j) dist[i][j] = 1e9; for(int i=1; i<=origCnt; i++){ for(auto y: link[origLst[i]]){ dist[i][isOriginal[y] ? idx[y] : num[y]] = 1; dist[isOriginal[y] ? idx[y] : num[y]][i] = 1; } } for(int k=1; k<=origCnt; k++){ for(int i=1; i<=origCnt; i++){ for(int j=1; j<=origCnt; j++){ dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]); } } } for(int i=1; i<=origCnt; i++) for(int j=i+1; j<=origCnt; j++) ans[dist[i][j]]++; for(int i=1; i<=R; i++) Answer(i, ans[i]); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...