Submission #349513

#TimeUsernameProblemLanguageResultExecution timeMemory
349513Kerim자동 인형 (IOI18_doll)C++17
53 / 100
165 ms21136 KiB
#include "doll.h" #include "bits/stdc++.h" #define MAXN 200009 #define INF 1000000007 #define mp(x,y) make_pair(x,y) #define all(v) v.begin(),v.end() #define pb(x) push_back(x) #define wr cout<<"----------------"<<endl; #define ppb() pop_back() #define tr(ii,c) for(__typeof((c).begin()) ii=(c).begin();ii!=(c).end();ii++) #define ff first #define ss second #define my_little_dodge 46 #define debug(x) cerr<< #x <<" = "<< x<<endl; using namespace std; typedef long long ll; typedef pair<int,int> PII; template<class T>bool umin(T& a,T b){if(a>b){a=b;return 1;}return 0;} template<class T>bool umax(T& a,T b){if(a<b){a=b;return 1;}return 0;} vector<int>X,Y; int S,M,ans[MAXN<<2],shift[MAXN<<2]; void rec(int nd,int pos,int rem,int id){ if(rem<0){ ans[pos]=id; return; } shift[nd]^=1; if(shift[nd])rec(nd*2,pos,rem-1,id); else rec(nd*2+1,pos+(1<<rem),rem-1,id); } int solve(vector<int>v){ int sz=int(v.size()),K=0; if(sz==0)return 0; if(sz==1)return v[0]; while((1<<K)<sz)K++; for(int i=0;i<(1<<K);i++) rec(1,0,K-1,i); int root=--S,rem=(1<<K)-sz; for(int i=1;i<(1<<K)/2;i++) X.pb(--S),Y.pb(--S); for(int i=0;i<(1<<K);i++){ if(i%2==0){ if(ans[i]<rem)X.pb(root); else X.pb(v[ans[i]-rem]); } else{ if(ans[i]<rem)Y.pb(root); else Y.pb(v[ans[i]-rem]); } } return root; } vector<int>adj[MAXN]; void create_circuit(int m, std::vector<int> A) { M=m;A.pb(0);vector<int>C(M+1); int N=int(A.size()); for(int i=0;i<N;i++) adj[A[i]].pb(A[(i+1)%N]); for(int i=0;i<=M;i++) C[i]=solve(adj[i]); answer(C,X,Y); }
#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...