제출 #802311

#제출 시각아이디문제언어결과실행 시간메모리
802311PixelCatPaint By Numbers (IOI16_paint)C++14
100 / 100
132 ms90712 KiB
#include "paint.h" #ifdef NYAOWO #include "grader.cpp" #endif #include <bits/stdc++.h> #define For(i, a, b) for(int i = a; i <= b; i++) #define Forr(i, a, b) for(int i = a; i >= b; i--) #define F first #define S second #define eb emplace_back #define all(x) x.begin(), x.end() #define sz(x) ((int)x.size()) // #define int LL using namespace std; using LL = long long; using pii = pair<int, int>; const int MAXN = 200'000; const int MAXK = 100; int dp[MAXK + 10][MAXN + 10]; int last_white[MAXN + 10]; int last_black[MAXN + 10]; int owo[MAXN + 10]; int tag[MAXN + 10]; // 0 = no, 1 = white, 2 = black, 1|2 = both string solve_puzzle(string s, vector<int32_t> c) { s = '_' + s; int n = sz(s); int k = sz(c); memset(dp , 0, sizeof(dp )); memset(tag, 0, sizeof(tag)); // build table for next/previous white/black cells last_white[0] = last_black[0] = 0; For(i, 1, n) { if(s[i - 1] == 'X') last_black[i] = i; else last_black[i] = last_black[i - 1]; if(s[i - 1] == '_') last_white[i] = i; else last_white[i] = last_white[i - 1]; } // walk from beginning For(i, 0, n) { if(i && last_black[i] == i) break; dp[0][i] = 1; } For(j, 1, k) { int len = c[j - 1]; For(i, 1, n) { if(i >= len && i - last_white[i] >= len && last_black[i - len] != i - len && dp[j - 1][i - len - 1]) { dp[j][i] |= 2; } if(last_black[i] != i && dp[j][i - 1]) { dp[j][i] |= 1; } } } // restore transitions dp[k][n] |= 4; Forr(j, k, 0) { int len = j ? c[j - 1] : 0; Forr(i, n, 2) if(dp[j][i] & 4) { if(dp[j][i] & 2) { dp[j - 1][i - len - 1] |= 4; owo[i - len + 1] = max(owo[i - len + 1], len); tag[i - len] |= 1; } if(dp[j][i] & 1) { dp[j][i - 1] |= 4; tag[i] |= 1; } } } int now = 0; For(i, 1, n) { now = max(now - 1, owo[i]); if(now) tag[i] |= 2; } string ans; For(i, 2, n) { if(tag[i] == 3) ans.push_back('?'); if(tag[i] == 2) ans.push_back('X'); if(tag[i] == 1) ans.push_back('_'); } 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...