Submission #593072

#TimeUsernameProblemLanguageResultExecution timeMemory
593072alirezasamimi100Paint By Numbers (IOI16_paint)C++17
100 / 100
180 ms47680 KiB
#include "paint.h" #include <bits/stdc++.h> using namespace std; const int N = 2e5 + 10, K = 1e2 + 10; int ps[2][N],sp[2][N]; bool dp[N][K],pd[N][K]; int get(int c, int l, int r){ return ps[c][r]-ps[c][l-1]; } string solve_puzzle(string s, vector<int> c) { int n=s.size(),k=c.size(); s='#'+s; c.insert(c.begin(),0); for(int i=1; i<=n; i++){ ps[0][i]=ps[0][i-1]; ps[1][i]=ps[1][i-1]; if(s[i]=='_') ps[0][i]++; if(s[i]=='X') ps[1][i]++; } dp[0][0]=1; pd[n+1][k+1]=1; for(int i=1; i<=n; i++){ if(s[i]=='X') continue; for(int j=0; j<=k; j++){ dp[i][j]=dp[i-1][j]; if(j>0 && i>c[j] && get(0,i-c[j],i-1)==0) dp[i][j]|=dp[i-c[j]-1][j-1]; } } for(int i=n; i; i--){ if(s[i]=='X') continue; for(int j=k+1; j; j--){ pd[i][j]=pd[i+1][j]; if(j<=k && n-i>=c[j] && get(0,i+1,i+c[j])==0) pd[i][j]|=pd[i+c[j]+1][j+1]; } } for(int i=1; i<=n; i++){ for(int j=0; j<=k; j++){ if(dp[i][j] && pd[i][j+1]) sp[0][i]=1; if(!j) continue; if(i>=c[j] && dp[i-c[j]][j-1] && pd[i+1][j+1] && get(0,i-c[j]+1,i)==0){ sp[1][i-c[j]+1]++; sp[1][i+1]--; } } } string ans; for(int i=1; i<=n; i++){ sp[1][i]+=sp[1][i-1]; if(sp[1][i] && sp[0][i]) ans.push_back('?'); else if(sp[1][i]) ans.push_back('X'); else ans.push_back('_'); } 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...
#Verdict Execution timeMemoryGrader output
Fetching results...