Submission #1283041

#TimeUsernameProblemLanguageResultExecution timeMemory
1283041MMihalev스핑크스 (IOI24_sphinx)C++20
3 / 100
25 ms572 KiB
#include<iostream> #include<algorithm> #include<vector> #include<cmath> #include<set> #include<cstring> #include "sphinx.h" using namespace std; const int MAX_N=252; vector<int>ans,exp1,tmp; int n; int query[2][MAX_N][MAX_N]; bool check(bool wh,int l,int r,set<int>ids,int col) { bool full=1; for(int id:ids) { if(ans[id]==-1)full=0; } if(full)return 0; if(ids.size()==1) { for(int i=0;i<n;i++)exp1[i]=col; exp1[(*(ids.begin()))]=-1; if(perform_experiment(exp1)==1) { return 1; } return 0; } int cc=0; for(int i=0;i<n;i++)exp1[i]=col; for(int id:ids) { exp1[id]=-1; } for(int id:ids) { if(ans[id]!=-1) { if(id>0)cc--; if(id<n-1)cc--; } } if(query[wh][l][r]==-1) { query[wh][l][r]=perform_experiment(exp1); } int cnt=query[wh][l][r]; int st=(*(ids.begin())),en=(*(ids.rbegin())); if(cnt<cc+(en<n-1)+(st>0)+2*(ids.size())-1)return 1; return 0; } void rec(bool wh,int l,int r,set<int>ids,int col) { if(ids.size()==1) { tmp.push_back((*(ids.begin()))); ans[(*(ids.begin()))]=col; return; } int mid=(ids.size()-1)/2; vector<int>idd; for(int id:ids)idd.push_back(id); set<int>ids1,ids2; for(int i=0;i<ids.size();i++) { if(i<=mid)ids1.insert(idd[i]); else ids2.insert(idd[i]); } if(check(wh,l,mid,ids1,col))rec(wh,l,mid,ids1,col); else rec(wh,mid+1,r,ids2,col); } vector<int> find_colours(int N, std::vector<int> X, std::vector<int> Y) { n=N; exp1.resize(n); ans.resize(n); for(int i=0;i<n;i++) { ans[i]=-1; } set<int>idseven,idsodd; for(int i=0;i<n;i++) { if(i%2==0)idseven.insert(i); else idsodd.insert(i); } for(int col=0;col<n;col++) { for(int i=0;i<n;i++) { for(int j=i;j<n;j++) { query[0][i][j]=-1; query[1][i][j]=-1; } } tmp.clear(); while(idseven.size()>0) { bool full=1; for(int id:idseven) { if(ans[id]==-1)full=0; } if(full)break; if(check(0,0,idseven.size()-1,idseven,col))rec(0,0,idseven.size(),idseven,col); else break; } for(int x:tmp)idseven.erase(x); tmp.clear(); while(idsodd.size()>0) { bool full=1; for(int id:idsodd) { if(ans[id]==-1)full=0; } if(full)break; if(check(1,0,idsodd.size()-1,idsodd,col))rec(1,0,idsodd.size()-1,idsodd,col); else break; } for(int x:tmp)idsodd.erase(x); } return ans; }
#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...