Submission #138109

#TimeUsernameProblemLanguageResultExecution timeMemory
138109HassoonyPaint By Numbers (IOI16_paint)C++17
100 / 100
589 ms99708 KiB
#include <bits/stdc++.h> #include "paint.h" //#include "grader.cpp" using namespace std; typedef long long ll; const int MX=2e5+9; int Pref[MX],dp[MX][102],c[102],n,k,White[MX],BL[MX]; string s,ans; int GetSum(int l,int r){ int Pl=0; if(l)Pl=Pref[l-1]; return Pref[r]-Pl; } void add(int l,int r){ BL[l]++;BL[r+1]--; } int DP(int x,int y){ if(x>=n){ if(y != k)return 0; return 1; } int &ret=dp[x][y];if(ret!=-1)return ret; ret=0; if(y == k){ if(s[x] == 'X')return ret=0; ret=DP(x+1,y); if(ret)White[x] = 1; return ret; } if(x + c[y] - 1 >= n)return ret=0; bool OkWhite = 0, OkBlack = 0; if(s[x] == '_'){ White[x] = 1; return ret=DP(x+1,y); } else if(s[x] == 'X'){ add(x,x); if(GetSum(x,x+c[y]-1) == 0 && s[x+c[y]] != 'X')ret = DP(x+c[y]+1,y+1); if(ret){ add(x,x+c[y]-1); White[x+c[y]] = 1; } return ret; } else{ OkWhite = DP(x+1,y); if(GetSum(x,x+c[y]-1) == 0 && s[x+c[y]] != 'X'){ OkBlack = DP(x+c[y]+1,y+1); if(OkBlack){ add(x,x+c[y]-1); White[x+c[y]] = 1; } } } if(OkBlack && OkWhite) White[x] = 1, add(x,x); else if(OkBlack) add(x,x); else if(OkWhite) White[x] = 1; return ret=max(OkWhite, OkBlack); } string solve_puzzle(string S, vector<int> C){ s=S;n=s.size();k=C.size();ans=s;s+="####"; for(int i=0;i<n;i++)White[i] = 0; for(int i=0;i<k;i++)c[i]=C[i]; for(int i=0;i<n;i++)if(ans[i] == '.')ans[i] = '?'; Pref[0]=(s[0] == '_'); for(int i=1;i<n;i++)Pref[i]=Pref[i-1] + (s[i] == '_'); memset(dp,-1,sizeof(dp)); DP(0,0); for(int i=0;i<n;i++){ if(i)BL[i] += BL[i-1]; if(BL[i] && White[i])ans[i] = '?'; else if(BL[i]) ans[i] = 'X'; else ans[i]='_'; } 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...