Submission #1238542

#TimeUsernameProblemLanguageResultExecution timeMemory
1238542thuhiennePaint By Numbers (IOI16_paint)C++20
100 / 100
475 ms46844 KiB
#include <bits/stdc++.h> #include "paint.h" #include <cstdlib> using namespace std; int n,k; bool dppref[200009][109],dpsuff[200009][109]; //dppref i j: tu vi tri 1 -> i,lieu co the tao ra duoc j block den dau tien khong? bool mustwhite[200009],mustblack[200009]; int prewhite[200009],preblack[200009]; int tdgc[200009]; bool existwhite(int l,int r) { return (prewhite[r] - prewhite[l - 1]) != 0; } bool canbeblack(int l,int r) { return (l > 0) && (r <= n) && !existwhite(l,r); } string solve_puzzle(string fixed,vector <int> c) { //preprocessing n = fixed.size(),k = c.size(); vector <int> clue(k + 1); for (int i = 1;i <= k;i++) clue[i] = c[i - 1]; fixed = "!" + fixed; for (int i = 1;i <= n;i++) { prewhite[i] = prewhite[i - 1]; preblack[i] = preblack[i - 1]; if (fixed[i] == 'X') preblack[i]++; if (fixed[i] == '_') prewhite[i]++; } //dp calculating //dp prefix dppref[0][0] = 1; for (int i = 1;i <= n;i++) { for (int j = 0;j <= k;j++) { int siz = clue[j]; if (fixed[i] != 'X') { dppref[i][j] |= dppref[i - 1][j]; } if (fixed[i] != '_' && j != 0 && i >= siz) { int siz = clue[j]; if (i == siz) { if (j == 1) dppref[i][j] |= canbeblack(1,i); } else { dppref[i][j] |= canbeblack(i - siz + 1,i) && (fixed[i - siz] != 'X') && dppref[i - siz - 1][j - 1]; } } } } //dp suffix dpsuff[n + 1][0] = 1; for (int i = n;i >= 1;i--) { for (int j = k + 1;j >= 1;j--) { int siz = clue[j],d = k - j + 1; if (fixed[i] != 'X') { dpsuff[i][d] |= dpsuff[i + 1][d]; } if (fixed[i] != '_' && d != 0 && n - i + 1 >= siz) { if (n - i + 1 == siz) { if (d == 1) dpsuff[i][d] |= canbeblack(i,n); } else { dpsuff[i][d] |= canbeblack(i,i + siz - 1) && (fixed[i + siz] != 'X') && dpsuff[i + siz + 1][d - 1]; } } } } //check black for (int i = 1;i <= n;i++) { mustblack[i] = 1; for (int j = 0;j <= k;j++) { if (dppref[i - 1][j] && dpsuff[i + 1][k - j]) { mustblack[i] = 0; break; } } } //check white for (int group = 1;group <= k;group++) { int len = clue[group]; for (int place = 1;place + len - 1 <= n;place++) { if (!canbeblack(place,place + len - 1)) continue; if ( !dppref[max(0,place - 2)][group - 1] || fixed[place - 1] == 'X' ) continue; if ( !dpsuff[min(n + 1,place + len + 1)][k - group] || fixed[place + len] == 'X' ) continue; tdgc[place]++; tdgc[place + len]--; } } for (int i = 1;i <= n;i++) { tdgc[i] += tdgc[i - 1]; if (tdgc[i] >= 1) mustwhite[i] = 0; else mustwhite[i] = 1; } string ret; for (int i = 1;i <= n;i++) { if (fixed[i] != '.') ret.push_back(fixed[i]); else if (mustblack[i]) ret.push_back('X'); else if (mustwhite[i]) ret.push_back('_'); else ret.push_back('?'); } return ret; }

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...