Submission #344893

#TimeUsernameProblemLanguageResultExecution timeMemory
344893ogibogi2004Paint By Numbers (IOI16_paint)C++14
100 / 100
642 ms68756 KiB
#include "paint.h" #include <bits/stdc++.h> using namespace std; const int MAXN=2e5+6; const int MAXK=128; bool dp[MAXN][MAXK]; bool calculated[MAXN][MAXK]; bool xallowed[MAXN][MAXK]; bool yallowed[MAXN][MAXK]; bool xa[MAXN],ya[MAXN]; int b[MAXK],k; int pref[MAXN]; string s1; int get_pref(int x) { if(x<0)return 0; return pref[x]; } vector<pair<int,int> >aveei; bool dfs(int idx,int cntblocks) { //aveei.push_back({idx,cntblocks}); if(calculated[idx][cntblocks])return dp[idx][cntblocks]; calculated[idx][cntblocks]=1; if(idx>=s1.size()-3&&cntblocks==k) { return dp[idx][cntblocks]=1; } else if(idx>=s1.size()-3) { return dp[idx][cntblocks]=0; } if(s1[idx]=='_'||s1[idx]=='.') { bool xd=dfs(idx+1,cntblocks); //cout<<idx<<" "<<cntblocks<<" => "<<idx+1<<" "<<xd<<endl; if(xd) { ya[idx]=1; dp[idx][cntblocks]=1; } } if(cntblocks<k) { if(s1[idx]=='X'||s1[idx]=='.') { int nxt=idx+b[cntblocks+1]-1; if(nxt<s1.size()-3&&get_pref(nxt)-get_pref(idx-1)==0) { if(s1[nxt+1]!='X') { bool xd=dfs(nxt+2,cntblocks+1); //cout<<idx<<" "<<cntblocks<<" -> "<<nxt<<" "<<xd<<endl; if(xd) { for(int j=idx;j<=nxt;j++)xa[j]=1; ya[nxt+1]=1; dp[idx][cntblocks]=1; } } } } } return dp[idx][cntblocks]; } /*void dfs(int idx,int cntblocks) { if(idx<0)return; if(yallowed[idx][cntblocks]&&dp[idx-1][cntblocks]==1) { ya[idx]=1; dfs(idx-1,cntblocks); } if(idx-b[cntblocks]>=-1) { if(xallowed[idx][cntblocks]) { if(get_pref(idx)-get_pref(idx-b[cntblocks])==0&&(idx-b[cntblocks]==-1||s1[idx-b[cntblocks]]!='X')) { if(idx-b[cntblocks]-1<0||dp[idx-b[cntblocks]-1][cntblocks-1]) { for(int j=idx;j>idx-b[cntblocks]&&j>=0;j--)xa[j]=1; dfs(idx-b[cntblocks]-1,cntblocks-1); } } } } }*/ string solve_puzzle(string s,vector<int> c) { //return ""; k=c.size(); s1=s; reverse(s1.begin(),s1.end()); s1+="___"; reverse(s1.begin(),s1.end()); s1+="___"; for(int i=0;i<c.size();i++)b[i+1]=c[i]; for(int i=0;i<s1.size();i++) { pref[i]=get_pref(i-1); if(s1[i]=='_')pref[i]++; } /*for(int i=0;i<s.size();i++) { if(s[i]=='X') { for(int j=0;j<c.size();j++) { if(i-c[j]+1<0)continue; if(i-c[j]<=0||dp[i-c[j]-1][j]) { if(get_pref(i)-get_pref(i-c[j])==0&&(i-c[j]<0||s[i-c[j]]!='X')) { dp[i][j+1]=1; xallowed[i][j+1]=1; } } } } else if(s[i]=='_') { for(int j=0;j<=c.size();j++) { if(dp[i-1][j]) { dp[i][j]=1; yallowed[i][j]=1; } } } else { for(int j=0;j<=c.size();j++) { if(dp[i-1][j]) { dp[i][j]=1; yallowed[i][j]=1; } } for(int j=0;j<c.size();j++) { if(i-c[j]+1<0)continue; if(i-c[j]<=0||dp[i-c[j]-1][j]) { if(get_pref(i)-get_pref(i-c[j])==0&&(i-c[j]<0||s[i-c[j]]!='X')) { dp[i][j+1]=1; xallowed[i][j+1]=1; } } } } } dfs(s.size()-1,c.size());*/ dfs(0,0); string s2=""; for(int i=3;i<s1.size()-3;i++) { if(xa[i]) { if(ya[i])s2+="?"; else s2+="X"; } else s2+="_"; } /*for(auto xd:aveei) { cout<<xd.first<<" "<<xd.second<<" "<<dp[xd.first][xd.second]<<endl; } cout<<s2<<endl;*/ return s2; }

Compilation message (stderr)

paint.cpp: In function 'bool dfs(int, int)':
paint.cpp:25:8: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   25 |  if(idx>=s1.size()-3&&cntblocks==k)
      |     ~~~^~~~~~~~~~~~~
paint.cpp:29:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |  else if(idx>=s1.size()-3)
      |          ~~~^~~~~~~~~~~~~
paint.cpp:48:10: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   48 |    if(nxt<s1.size()-3&&get_pref(nxt)-get_pref(idx-1)==0)
      |       ~~~^~~~~~~~~~~~
paint.cpp: In function 'std::string solve_puzzle(std::string, std::vector<int>)':
paint.cpp:97:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   97 |     for(int i=0;i<c.size();i++)b[i+1]=c[i];
      |                 ~^~~~~~~~~
paint.cpp:98:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |  for(int i=0;i<s1.size();i++)
      |              ~^~~~~~~~~~
paint.cpp:158:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  158 |  for(int i=3;i<s1.size()-3;i++)
      |              ~^~~~~~~~~~~~
#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...