제출 #1319595

#제출 시각아이디문제언어결과실행 시간메모리
1319595wangzhiyi33Library (JOI18_library)C++20
100 / 100
129 ms3056 KiB
#include<bits/stdc++.h> #include "library.h" using namespace std; vector<int>ans,sisa; set<int>hmm; int n; void reset(vector<int>&t){ for(int q=0;q<t.size();q++){ t[q]=0; } } void kerja(int l,int r){ if(l>r)return; if(l==r){ ans[l]=sisa[0]; return; } vector<int>test; test.assign(n,0); int slsh=0; for(int q=0;q<10;q++){ reset(test); bool ada=false; for(auto x : sisa){ if((x>>q)&1){ test[x]=1; ada=true; } } // for(auto x : test){ // cout<<x<<" "; // } // cout<<endl; if(!ada)continue; int has1=Query(test); ada=false; for(auto x : sisa){ test[x]=1-test[x]; ada|=test[x]; } if(!ada)continue; int has2=Query(test); if(has1==has2){ slsh+=(1<<q); } } vector<int>cand; for(auto x : hmm){ if(hmm.count(x^slsh) && (x^slsh)>x){ cand.push_back(x); } } sort(cand.begin(),cand.end()); int L=0,R=cand.size()-1; int mana=0; while(L<=R){ int mid=(L+R)/2; reset(test); for(int q=0;q<=mid;q++){ test[cand[q]]=1; } int has1=Query(test); bool ada=false; for(auto x : sisa){ test[x]=1-test[x]; if(test[x])ada=true; } int has2; if(ada)has2=Query(test); if(ada && has1==has2){ mana=mid; R=mid-1; } else{ L=mid+1; } } int a=cand[mana],b=(slsh^a); if(l>=1){ reset(test); test[ans[l-1]]=1; test[a]=1; if(Query(test)!=1){ swap(a,b); } } ans[l]=a,ans[r]=b; //cout<<a<<" "<<b<<endl; sisa.erase(find(sisa.begin(),sisa.end(),a)); sisa.erase(find(sisa.begin(),sisa.end(),b)); hmm.erase(a),hmm.erase(b); kerja(l+1,r-1); } void Solve(int N){ n=N; ans.assign(N,0); for(int q=0;q<n;q++){ sisa.push_back(q); hmm.insert(q); } kerja(0,N-1); for(int q=0;q<n;q++){ ans[q]++; //cout<<ans[q]<<endl; } Answer(ans); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...