Submission #812146

#TimeUsernameProblemLanguageResultExecution timeMemory
812146jangwonyoungAncient Machine 2 (JOI23_ancient2)C++17
100 / 100
20 ms336 KiB
#include "ancient2.h" #include <string> #include <vector> namespace { int variable_example = 1; } // namespace #include<bits/stdc++.h> using namespace std; int n; string ans; int si[1000],sj[1000],sk[1000]; bool check(int i,int j,char c){ ans[i]=c; for(int k=i-j; k>=j-1 ;k-=j){ bool same=true; for(int l=0; l<j ;l++){ if(ans[k-l]!=ans[i-l]){ same=false;break; } } if(same) return false; } return true; } int build(int i,int j,int cl){ int m=2*j+1+cl; vector<int>a(m),b(m); for(int k=0; k<j ;k++){ a[k]=a[k+j]=b[k]=b[k+j]=k%j+1; if(ans[i-j+1+k]=='0') a[k+j]+=j; else b[k+j]+=j; } int iu=2*j+1; a[2*j]=iu; b[2*j]=iu+(1000-i)%cl; for(int k=0; k<cl ;k++){ a[iu+k]=b[iu+k]=iu+(k+1)%cl; } int st=j-i%j-1; if(st==0) st=j; for(auto &c:a) if(c==0 || c==st) c^=st; for(auto &c:b) if(c==0 || c==st) c^=st; swap(a[0],a[st]); swap(b[0],b[st]); int res=Query(m,a,b); return res; } void boom(int i,int j){ //cout << "BOOM " << i << ' ' << j << ' ' << ans[i] << endl; int cl=1; while(cl*(cl+1)<(1000-i)*2) cl++; int res=build(i,j,cl); if(res<2*j){//string not found ans[i]^=1; return; } if(i==n-1) return; if(res==2*j){ ans[n-1]=ans[i]; ans[i]^=1; return; } int res2=build(i,j,cl+1); int r1=res-2*j-1,r2=res2-2*j-1; int z=0; //if(res2==52) exit(0); while(z%cl!=r1 || z%(cl+1)!=r2) z++; int pos=n-z%(1000-i)-2; sj[i]=j;sk[i]=pos; ans[pos]=ans[i]; ans[pos+1]='0'+(z>=(1000-i)); if(pos!=i) ans[i]^=1; } string Solve(int N){ n=N; ans.resize(N); for(int i=0; i<N ;i++) ans[i]='2'; for(int i=0; i<N ;i++){ //cout << "solve " << i << endl; if(ans[i]!='2') continue; { for(int x=0; x<i ;x++){ if(sj[x]==0 || (i-x)%sj[x]!=0 || i>=sk[x]) continue; bool same=true; for(int j=1; j<sj[x] ;j++){ if(ans[i-j]!=ans[x-j]){ same=false; break; } } if(same){ ans[i]=ans[x]; break; } } } if(ans[i]!='2') continue; for(int j=1; ;j++){ bool done=false; if(check(i,j,'0')){ done=true; boom(i,j); } else if(check(i,j,'1')){ done=true; boom(i,j); } if(done) break; } //cout << "progress " << i << endl; /*for(int i=0; i<n ;i++) cout << ans[i]; cout << endl;*/ } return ans; }

Compilation message (stderr)

ancient2.cpp:8:5: warning: '{anonymous}::variable_example' defined but not used [-Wunused-variable]
    8 | int variable_example = 1;
      |     ^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...