Submission #1180200

#TimeUsernameProblemLanguageResultExecution timeMemory
1180200HappyCapybaraPaint By Numbers (IOI16_paint)C++20
100 / 100
403 ms44104 KiB
#include "paint.h" #include<bits/stdc++.h> using namespace std; int n; vector<vector<bool>> st; bool query(int l, int r){ int lg = 31 - __builtin_clz(r-l+1); return st[l][lg] | st[r-(1<<lg)+1][lg]; } string solve_puzzle(string s, vector<int> c){ //cout << "a" << endl; int k = c.size(); n = s.size(); st.resize(n, vector<bool>(20, false)); for (int j=0; j<20; j++){ for (int i=0; i<n; i++){ if (j == 0){ if (s[i] == '_') st[i][j] = true; continue; } if (i+(1<<(j-1)) < n) st[i][j] = st[i][j-1] | st[i+(1<<j-1)][j-1]; } } vector<vector<bool>> dpl(n+2, vector<bool>(k+1, false)), dpr(n+2, vector<bool>(k+1, false)); //cout << "b" << endl; for (int j=0; j<=k; j++){ for (int i=0; i<=n+1; i++){ if (i <= 1){ if (j == 0) dpr[i][j] = true; else dpr[i][j] = false; continue; } if (j == 0){ if (s[i-2] != 'X') dpr[i][j] = dpr[i-1][j]; continue; } if ((s[i-2] != 'X') && dpr[i-1][j]){ dpr[i][j] = true; continue; } if ((s[i-2] != '_') && i-2-c[j-1]+1 >= 0 && !query(i-2-c[j-1]+1, i-2) && (i-2-c[j-1] == -1 || s[i-2-c[j-1]] != 'X') && dpr[i-c[j-1]-1][j-1]) dpr[i][j] = true; } } //cout << "c" << endl; vector<int> pos(n, -1); for (int j=k; j>=0; j--){ for (int i=n+1; i>=0; i--){ if (i >= n){ if (j == k) dpl[i][j] = true; else dpl[i][j] = false; continue; } if (j == k){ if (s[i] != 'X') dpl[i][j] = dpl[i+1][j]; continue; } if ((s[i] != '_') && i+c[j]-1 < n && !query(i, i+c[j]-1) && (i+c[j] == n || s[i+c[j]] != 'X') && dpl[i+c[j]+1][j+1]){ dpl[i][j] = true; if ((i == 0 && j == 0) || (s[i-1] != 'X' && ((i == 1 && j == 0) || dpr[i-2+2][j]))) pos[i] = max(pos[i], i+c[j]-1); } if ((s[i] != 'X' || s[i] == '.') && dpl[i+1][j]) dpl[i][j] = true; } } /*for (int i=0; i<=n+1; i++){ for (int j=0; j<=k; j++) cout << dpr[i][j]; cout << endl; }*/ string res = s; for (int i=0; i<n; i++){ if (s[i] == '.'){ for (int j=0; j<=k; j++){ if (dpl[i+1][j] && dpr[i-1+2][j]){ res[i] = '_'; break; } } } } //cout << res << endl; int cur = 0; for (int l=0; l<n; l++){ int r = pos[l]; for (int i=max(l, cur); i<=r; i++){ if (s[i] == '.'){ if (res[i] == '_' || res[i] == '?') res[i] = '?'; else res[i] = 'X'; } } } return res; }

Compilation message (stderr)

paint.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
paint_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...