Submission #999359

#TimeUsernameProblemLanguageResultExecution timeMemory
999359ByeWorldPaint By Numbers (IOI16_paint)C++14
100 / 100
201 ms348616 KiB
#include "paint.h" #include <bits/stdc++.h> #define ll long long #define pb push_back #define fi first #define se second using namespace std; const int MAXN = 2e5+10; const int MAXK = 110; const int INF = 1e9+10; typedef pair<int,int> pii; void chmx(int &a, int b){ a = max(a, b); } int n; string s, ANS; int cnt[MAXN]; int dpP[MAXN][MAXK], dpS[MAXN][MAXK], bl[MAXN], wh[MAXN]; int canP[MAXN][MAXK], canS[MAXN][MAXK]; vector <int> c; int k; string solve_puzzle(string S, vector<int> C) { s = '_'+S+'_'; n = s.size()-2; for(int i=1; i<=n; i++) cnt[i] = cnt[i-1] + (s[i]=='_'); c.pb(-1); for(auto in : C) c.pb(in); k = c.size()-1; dpP[0][0] = 1; canP[0][0] = 1; for(int i=1; i<=n; i++){ for(int j=1; j<=k; j++){ // a[i] jadi ending dr segment j int len = c[j]; // i-c[j]+1 ... i if(i-c[j]+1 <= 0) continue; if(cnt[i]-cnt[i-c[j]] != 0) continue; if(s[i-c[j]] == 'X') continue; // terakhir jadi X if(i-c[j]==0){ if(canP[i-c[j]][j-1]) dpP[i][j] = 1; } else if(canP[i-c[j]-1][j-1]){ dpP[i][j] = 1; } // cout << i << ' ' << j << ' ' << dpP[i][j] << " dp\n"; } // build canP for(int j=0; j<=k; j++){ // a[i] jadi ending dr segment j if(s[i] != 'X'){ canP[i][j] = canP[i-1][j] | dpP[i][j]; } else { // wajib X canP[i][j] = dpP[i][j]; } } } dpS[n+1][k+1] = 1; canS[n+1][k+1] = 1; for(int i=n; i>=1; i--){ for(int j=k; j>=1; j--){ // a[i] jadi start dr segment j int len = c[j]; // i ... i+c[j]-1 if(i+c[j]-1 > n) continue; if(cnt[i+c[j]-1]-cnt[i-1] != 0) continue; if(s[i+c[j]] == 'X') continue; // terakhir jadi X if(i+c[j]==n+1){ if(canS[i+c[j]][j+1]) dpS[i][j] = 1; } else if(canS[i+c[j]+1][j+1]){ dpS[i][j] = 1; } // cout << i << ' ' << j << ' ' << dpS[i][j] << " p\n"; } // build canS for(int j=k+1; j>=1; j--){ // a[i] jadi ending dr segment j if(s[i] != 'X'){ canS[i][j] = canS[i+1][j] | dpS[i][j]; } else { // wajib X canS[i][j] = dpS[i][j]; } } } for(int i=1; i<=n-1; i++){ for(int j=1; j<=k; j++){ if(dpP[i][j] && canS[i+2][j+1] && s[i+1] != 'X'){ bl[i-c[j]+1]++; bl[i+1]--; } } } { int i=n; if(dpP[i][k]){ bl[i-c[k]+1]++; bl[i+1]--; } } // for(int i=1; i<=3; i++){ // for(int j=0; j<=k+1; j++){ // cout << i << ' ' << j << ' ' << canP[i][j] << " p\n"; // } // } // for(int i=1; i<=3; i++){ // for(int j=1; j<=k+1; j++){ // cout << i << ' ' << j << ' ' << canS[i][j] << " xx\n"; // } // } for(int i=1; i<=n; i++){ for(int j=0; j<=k; j++){ if(canP[i-1][j] && canS[i+1][j+1]){ wh[i] = 1; } } } // for(int i=1; i<=n; i++){ // if(wh[i]) cout << '1'; // else cout << '0'; // } // cout << " pp\n"; for(int i=1; i<=n; i++) bl[i] += bl[i-1]; for(int i=1; i<=n; i++){ if(s[i] != '.'){ ANS += s[i]; continue; } if(bl[i] && wh[i]) ANS += '?'; else if(bl[i]) ANS += 'X'; else if(wh[i]) ANS += '_'; else assert(false); } return ANS; } /* .......... 2 3 4 */

Compilation message (stderr)

paint.cpp: In function 'std::string solve_puzzle(std::string, std::vector<int>)':
paint.cpp:34:8: warning: unused variable 'len' [-Wunused-variable]
   34 |    int len = c[j];
      |        ^~~
paint.cpp:62:8: warning: unused variable 'len' [-Wunused-variable]
   62 |    int len = c[j];
      |        ^~~
#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...