Submission #206755

#TimeUsernameProblemLanguageResultExecution timeMemory
206755kshitij_sodaniPaint By Numbers (IOI16_paint)C++17
100 / 100
1179 ms169584 KiB
#include <iostream> #include <bits/stdc++.h> #include <paint.h> using namespace std; #define mp make_pair #define pb push_back typedef long long llo; #define a first #define b second #define endl "\n" string solve_puzzle(string s,vector<int> c){ int k=c.size(); int n=s.size(); char ss[n]; strcpy(ss,s.c_str()); int it[n]; for(int i=0;i<n;i++){ if(ss[i]=='.'){ it[i]=0; } else if(ss[i]=='_'){ it[i]=1; } else{ it[i]=2; } } char ans[n]; for(int i=0;i<n;i++){ ans[i]=ss[i]; if(ans[i]=='.'){ ans[i]='?'; } } int dp[k+1][n]; memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++){ if(it[i]==2){ break; } dp[0][i]=1; } int back[n]; int so=0; int ind5; for(int i=0;i<n;i++){ if(it[i]!=1){ if(so==1){ back[i]=ind5; } else{ back[i]=i; ind5=i; so=1; } } else{ so=0; } } for(int kk=1;kk<k+1;kk++){ for(int i=0;i<n;i++){ if(it[i]==1){ if(i>0){ dp[kk][i]=dp[kk][i-1]; } } else if(it[i]==2){ if(i>=c[kk-1]-1){ if(back[i]>i-c[kk-1]+1){ continue; } if(i-c[kk-1]>=0){ if(it[i-c[kk-1]]==2){ continue; } } if(i-c[kk-1]-1>=0){ dp[kk][i]=dp[kk-1][i-c[kk-1]-1]; } else{ if(kk==1){ dp[kk][i]=1; } } } } else{ if(i>=c[kk-1]-1){ int sp=1; if(back[i]>i-c[kk-1]+1 and sp){ sp=0; } if(i-c[kk-1]>=0 and sp){ if(it[i-c[kk-1]]==2 and sp){ sp=0; } } if(i-c[kk-1]-1>=0 and sp){ dp[kk][i]=dp[kk-1][i-c[kk-1]-1]; } else{ if(kk==1 and sp==1){ dp[kk][i]=1; } } } if(i>0){ dp[kk][i]=min(dp[kk][i]+dp[kk][i-1],1); } } } } int tt[n]; for(int i=0;i<n;i++){ tt[i]=it[n-i-1]; } int dp2[k+1][n]; int cc[k]; for(int i=0;i<k;i++){ cc[i]=c[k-i-1]; } memset(dp2,0,sizeof(dp2)); for(int i=0;i<n;i++){ if(tt[i]==2){ break; } dp2[0][i]=1; } int back2[n]; int soo=0; for(int i=0;i<n;i++){ if(tt[i]!=1){ if(soo==1){ back2[i]=ind5; } else{ back2[i]=i; ind5=i; soo=1; } } else{ soo=0; } } for(int kk=1;kk<k+1;kk++){ for(int i=0;i<n;i++){ if(tt[i]==1){ if(i>0){ dp2[kk][i]=dp2[kk][i-1]; } } else if(tt[i]==2){ if(i>=cc[kk-1]-1){ if(back2[i]>i-cc[kk-1]+1){ continue; } if(i-cc[kk-1]>=0){ if(tt[i-cc[kk-1]]==2){ continue; } } if(i-cc[kk-1]-1>=0){ dp2[kk][i]=dp2[kk-1][i-cc[kk-1]-1]; } else{ if(kk==1){ dp2[kk][i]=1; } } } } else{ if(i>=cc[kk-1]-1){ int sp=1; if(back2[i]>i-cc[kk-1]+1 and sp){ sp=0; } if(i-cc[kk-1]>=0 and sp){ if(tt[i-cc[kk-1]]==2 and sp){ sp=0; } } if(i-cc[kk-1]-1>=0 and sp){ dp2[kk][i]=dp2[kk-1][i-cc[kk-1]-1]; } else{ if(kk==1 and sp==1){ dp2[kk][i]=1; } } } if(i>0){ dp2[kk][i]=min(dp2[kk][i]+dp2[kk][i-1],1); } } } } int white[n]; memset(white,0,sizeof(white)); int black[n]; memset(black,0,sizeof(black)); for(int i=0;i<n;i++){ if(it[i]==0){ int spp=1; for(int j=0;j<k+1;j++){ int coo=0; if(it[i]==2){ continue; } if(i>0){ coo+=dp[j][i-1]; } else if(j==0){ coo+=1; } if(i+1<=n-1){ coo+=dp2[k-j][n-1-(i+1)]; } else{ if(j==k){ coo+=1; } } if(coo==2){ spp=0; } } if(spp==1){ black[i]=1; } else{ white[i]=1; } } } int vis[n]; memset(vis,0,sizeof(vis)); vector<int> pp; for(int i=0;i<k;i++){ int pos=0; int l,r; vector<int> dd; int las; int sta; for(int j=0;j<n-c[i]+1;j++){ if(j+c[i]<n){ if(it[j+c[i]]==2 or (white[j+c[i]]==0 and it[j+c[i]]==0)){ continue; } } if(back[j+c[i]-1]>j or it[j+c[i]-1]==1){ continue; } if(j>0){ if(it[j-1]==2 or (white[j-1]==0 and it[j-1]==0)){ continue; } } int coo=0; if(j-2>=0){ if(dp[i][j-2]){ coo+=1; } } else{ if(i==0){ coo+=1; } } /* if(i==0 and j==6){ cout<<"ooo "<<coo<<endl; }*/ if(n-1-(1+j+c[i])>=0){ if(dp2[k-i-1][n-1-(1+j+c[i])]){ coo+=1; } } else{ if(k-i-1==0){ coo+=1; } } if(coo==2){ if(pos==0){ l=j; dd.pb(j); r=j+c[i]-1; sta=j; las=r; pos=1; } else{ dd.pb(j); l=max(l,j); las=j+c[i]-1; r=min(r,j+c[i]-1); } } } int ll,rr; vector<pair<int,int>> ee; for(int jj=0;jj<dd.size();jj++){ if(jj==0){ ll=dd[jj]; rr=dd[jj]+c[i]-1; ee.pb(mp(ll,rr)); } else{ if(dd[jj]>ee[ee.size()-1].b){ ee.pb(mp(dd[jj],dd[jj]+c[i]-1)); } else{ ee[ee.size()-1].b=dd[jj]+c[i]-1; } } } for(int jj=0;jj<ee.size();jj++){ for(int kk=ee[jj].a;kk<ee[jj].b+1;kk++){ black[kk]=1; } } } string ans2=""; /* for(int i=0;i<n;i++){ cout<<black[i]<<",,"; } cout<<endl;*/ for(int i=0;i<pp.size();i++){ if(it[pp[i]]==0){ //cout<<pp[i]<<" "; it[pp[i]]=1; } } for(int i=0;i<n;i++){ if(it[i]==0){ if(white[i] and black[i]){ ans2+="?"; } else if(white[i]){ ans2+="_"; } else{ ans2+="X"; } } else if(it[i]==1){ ans2+="_"; } else{ ans2+="X"; } } return ans2; } /*int main(){ vector<int> bb={2,3}; cout<<"..._._...."<<endl; // cout<<solve_puzzle(".X........", {3})<<endl; cout<<solve_puzzle("..._._....", {3})<<endl; cout<<solve_puzzle("........", {3, 4})<<endl; cout<<solve_puzzle("..........", {3, 4})<<endl; cout<<"X......"<<endl; cout<<solve_puzzle("X......", {2,3})<<endl; cout<<solve_puzzle(".X._.._...", {2,3})<<endl; return 0; }*/

Compilation message (stderr)

paint.cpp: In function 'std::__cxx11::string solve_puzzle(std::__cxx11::string, std::vector<int>)':
paint.cpp:339:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int jj=0;jj<dd.size();jj++){
                ~~^~~~~~~~~~
paint.cpp:354:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int jj=0;jj<ee.size();jj++){
                ~~^~~~~~~~~~
paint.cpp:266:7: warning: variable 'las' set but not used [-Wunused-but-set-variable]
   int las;
       ^~~
paint.cpp:267:7: warning: variable 'sta' set but not used [-Wunused-but-set-variable]
   int sta;
       ^~~
paint.cpp:366:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<pp.size();i++){
              ~^~~~~~~~~~
paint.cpp:142:13: warning: 'ind5' may be used uninitialized in this function [-Wmaybe-uninitialized]
     back2[i]=ind5;
     ~~~~~~~~^~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...