Submission #150471

#TimeUsernameProblemLanguageResultExecution timeMemory
150471코딩은 체육과목입니다 (#200)On the Grid (FXCUP4_grid)C++17
12 / 100
28 ms2560 KiB
#include "grid.h" #include <random> #include <algorithm> #include <map> using namespace std; int n; vector<int> ans; vector<int> idx; map<vector<int>, int> logs; vector<vector<bool>> vis; int count_candi(int x){ int cnt = 0; for(int i=0;i<n;i++){ if (vis[x][i])cnt++; } return cnt; } int get_max_disk(int x) { vector<int> v; std::random_device rd; std::mt19937 g(rd()); for(int i=0;i<n;i++){ if (!ans[i]){ v.push_back(i); } } int p = x; int cnt = 0; while(p){ cnt++; p /= 2; } for(int i=0;i<cnt;i++){ if (count_candi(x) < x/20)break; shuffle(v.begin(), v.end(), g); vector<int> t = v; for(int j=x+1; j<=n; j++){ t.push_back(idx[j]); } int r = logs[t]; if (!r){ r = PutDisks(t); logs[t] = r; } r -= (n-x); r -= x - 1; for(int q = x-r; q >= 1; q--){ for(int j=0;j<q;j++){ vis[q+r][v[j]] = false; } } } for(int i=0;i<n;i++){ if (vis[x][i]){ //printf("#"); vector<int> v; v.push_back(i); for(int j=0;j<n;j++){ if (!ans[j] && j != i){ v.push_back(j); } } for(int j=x+1;j<=n;j++){ v.push_back(idx[j]); } int r = logs[v]; if(!r){ r = PutDisks(v); logs[v] = r; } if (r - (n-x) == 2*x-1) { puts(""); return i; } } } return -1; } std::vector<int> SortDisks(int N) { n = N; ans.resize(n); idx.resize(n+1); vis.resize(n+1); for(int i=1;i<=n;i++){ vis[i].resize(n, true); } for(int i=n;i>=1;i--){ int x = get_max_disk(i); ans[x] = i; idx[i] = x; for(int j=1;j<i;j++){ vis[j][x] = false; } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...