제출 #115842

#제출 시각아이디문제언어결과실행 시간메모리
115842RockyBPaint By Numbers (IOI16_paint)C++17
100 / 100
547 ms98424 KiB
/// In The Name Of God #pragma GCC optimize("Ofast") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #include <bits/stdc++.h> #define f first #define s second #define pb push_back #define pp pop_back #define mp make_pair #define sz(x) (int)x.size() #define sqr(x) ((x) * 1ll * (x)) #define all(x) x.begin(), x.end() #define rep(i, l, r) for (int i = (l); i <= (r); i++) #define Kazakhstan ios_base :: sync_with_stdio(0), cin.tie(0), cout.tie(0); #define nl '\n' #define ioi exit(0); typedef long long ll; typedef long double ld; typedef unsigned long long ull; const int N = (int)2e5 + 7; const int inf = (int)1e9 + 7; const int mod = (int)1e9 + 7; const ll linf = (ll)1e18 + 7; const int dx[] = {-1, 0, 1, 0, 1, -1, -1, 1}; const int dy[] = {0, 1, 0, -1, 1, -1, 1, -1}; using namespace std; int n, k; int pref[N]; vector <int> a; string s; int bad[N]; inline bool check(int l, int r) { return !(l ? pref[r] - pref[l - 1] : pref[r]) && (r + 1 == n || s[r + 1] != 'X'); } int dp[101][N]; vector < pair <int, int> > rng; string cur; int X[N], _[N]; inline bool calc(int v, int id) { if (v >= n) { return id == k; } if (~dp[id][v]) return dp[id][v]; bool res = 0; if (s[v] != 'X') { if (calc(v + 1, id)) { X[v]++; X[v + 1]--; res |= 1; } } if (id < k && v + a[id] <= n) { if (check(v, v + a[id] - 1) && calc(v + a[id] + 1, id + 1)) { _[v]++; _[v + a[id]]--; X[v + a[id]]++; X[v + a[id] + 1]--; res |= 1; } } return dp[id][v] = res; } string solve_puzzle(string S, vector <int> c) { n = sz(S); s = S; a = c; k = sz(c); // --- coppying for (int i = 0; i < n; i++) { pref[i] = s[i] == '_'; if (i) pref[i] += pref[i - 1]; } memset(dp, -1, sizeof(dp)); calc(0, 0); for (int i = 1; i < n; i++) { X[i] += X[i - 1]; _[i] += _[i - 1]; } for (int i = 0; i < n; i++) { if (X[i] && _[i]) s[i] = '?'; else if (X[i]) s[i] = '_'; else s[i] = 'X'; } return s; } #ifdef IOI2018 const int S_MAX_LEN = 200 * 1000; char buf[S_MAX_LEN + 1]; int main() { freopen ("in.txt", "r", stdin); freopen ("D.out", "w", stdout); assert(1 == scanf("%s", buf)); std::string s = buf; int c_len; assert(1 == scanf("%d", &c_len)); std::vector<int> c(c_len); for (int i = 0; i < c_len; i++) { assert(1 == scanf("%d", &c[i])); } std::string ans = solve_puzzle(s, c); printf("%s\n", ans.data()); return 0; } #endif

컴파일 시 표준 에러 (stderr) 메시지

paint.cpp: In function 'bool calc(int, int)':
paint.cpp:79:19: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
  return dp[id][v] = res;
         ~~~~~~~~~~^~~~~
#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...