제출 #940809

#제출 시각아이디문제언어결과실행 시간메모리
940809snpmrnhlol자동 인형 (IOI18_doll)C++17
100 / 100
89 ms13764 KiB
#include "doll.h" #include <bits/stdc++.h> using namespace std; void create_circuit(int m, vector<int> a) { int n = a.size(); int len = 0; int cnt = -2; while((1<<len) < n + 1)len++; vector <int> c(m + 1); vector <int> x((1<<len) - 1); vector <int> y((1<<len) - 1); vector <int> x2; vector <int> y2; vector <array<int,3>> ord; for(int i = 0;i < m + 1;i++){ c[i] = -1; } auto dfs = [&](auto self,int node,int d) -> void { if(d == len - 1){ x[-node - 1] = -1; y[-node - 1] = -1; }else{ x[-node - 1] = cnt--; self(self,cnt + 1,d + 1); y[-node - 1] = cnt--; self(self,cnt + 1,d + 1); } }; int cnt2 = 0,last = 0; auto dfs2 = [&](auto self,int node,int d) -> void { if(d == len - 1){ int nr = 0; for(int j = 0;j < len;j++){ if(cnt2>>j&1){ nr|=(1<<(len - j - 1)); } } if(cnt2 + n >= (1<<len) - 1 && cnt2 != (1<<len) - 1)ord.push_back({nr,node,0}); cnt2++; if(cnt2 + n >= (1<<len) - 1 && cnt2 != (1<<len) - 1)ord.push_back({nr + (1<<len),node,1}); cnt2++; last = node; }else{ self(self,-x[node] - 1,d + 1); self(self,-y[node] - 1,d + 1); } }; auto dfs3 = [&](auto self,int node,int d) -> int { if(d == len - 1){ if(x[node] == -1 && y[node] == -1){ return -1; }else{ x2.push_back(x[node]); y2.push_back(y[node]); return x2.size() - 1; } }else{ if(node == 0){ x2.push_back(0); y2.push_back(0); } int l = self(self,-x[node] - 1,d + 1); int r = self(self,-y[node] - 1,d + 1); if(l == -1 && r == -1)return -1; else{ if(node == 0){ if(l != -1){ x2[0] = -l - 1; }else x2[0] = -1; if(r != -1){ y2[0] = -r - 1; }else y2[0] = -1; }else{ if(l != -1){ x2.push_back(-l - 1); }else x2.push_back(-1); if(r != -1){ y2.push_back(-r - 1); }else y2.push_back(-1); } return x2.size() - 1; } } }; dfs(dfs,-1,0); dfs2(dfs2,0,0); int cnt3 = 0; sort(ord.begin(),ord.end()); for(auto i:ord){ //cout<<i[0]<<' '<<i[1]<<' '<<i[2]<<'\n'; if(i[2] == 0){ x[i[1]] = a[cnt3]; }else{ y[i[1]] = a[cnt3]; } cnt3++; } y[last] = 0; /*for(int i = 0;i < (1<<len) - 1;i++){ cout<<x[i]<<' '<<y[i]<<'\n'; }*/ dfs3(dfs3,0,0); /*for(int i = 0;i < x2.size();i++){ cout<<x2[i]<<' '<<y2[i]<<'\n'; }*/ return answer(c,x2,y2); } /** 7 7 1 2 3 4 5 6 7 **/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...