제출 #522667

#제출 시각아이디문제언어결과실행 시간메모리
522667maomao90벽 칠하기 (APIO20_paint)C++17
100 / 100
401 ms16532 KiB
#include "paint.h"
#include <bits/stdc++.h>
using namespace std;

#define REP(i, j, k) for (int i = j; i < k; i++)
#define RREP(i, j, k) for (int i = j; i >= k; i--)

template <class T>
inline bool mxto(T &a, T b) {return a < b ? a = b, 1 : 0;}
template <class T>
inline bool mnto(T &a, T b) {return a > b ? a = b, 1 : 0;}

typedef long long ll;
#define FI first
#define SE second
#define MP make_pair
typedef pair<int, int> ii;
#define pb push_back
#define ALL(x) x.begin(), x.end()
typedef vector<int> vi;

#ifndef DEBUG
#define cerr if (0) cerr
#endif

#define MAXN 100005
#define INF 1000000005

int n, m, k;
vi c, a;
vector<vi> b;
vi mp[MAXN];
int dp[2][MAXN];

int minimumInstructions(int n, int m, int k, vi c, vi a, vector<vi> b) {
    ::n = n; ::m = m; ::k = k; ::c = c; ::a = a; ::b = b;
    REP (i, 0, m) {
        for (int j : b[i]) {
            mp[j].pb(i);
        }
    }
    REP (i, 0, m) {
        dp[0][i] = dp[1][i] = -INF;
    }
    vi rng;
    int prv = 1, cur = 0;
    RREP (i, n - 1, 0) {
        if (i + 2 < n) {
            for (int j : mp[c[i + 2]]) {
                dp[cur][j] = -INF;
            }
        }
        int mx = -INF;
        for (int j : mp[c[i]]) {
            dp[cur][j] = i;
            int k = j + 1 == m ? 0 : j + 1;
            if (i != n - 1 && dp[prv][k] != -INF) {
                dp[cur][j] = dp[prv][k];
            }
            mxto(mx, dp[cur][j]);
        }
        if (mx - i + 1 >= m) {
            rng.pb(i);
        }
        swap(prv, cur);
    }
    reverse(ALL(rng));
    if (rng.empty() || rng[0] != 0 || rng.back() != n - m) {
        return -1;
    }
    if (rng.size() == 1) {
        return 1;
    }
    int r = m;
    int ans = 2;
    REP (i, 1, rng.size() - 1) {
        if (rng[i] > r) {
            return -1;
        }
        if (rng[i + 1] > r) {
            r = rng[i] + m;
            ans++;
        }
    }
    if (n - m > r) return -1;
    return ans;
}

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

paint.cpp: In function 'int minimumInstructions(int, int, int, vi, vi, std::vector<std::vector<int> >)':
paint.cpp:5:40: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    5 | #define REP(i, j, k) for (int i = j; i < k; i++)
......
   76 |     REP (i, 1, rng.size() - 1) {
      |          ~~~~~~~~~~~~~~~~~~~~           
paint.cpp:76:5: note: in expansion of macro 'REP'
   76 |     REP (i, 1, rng.size() - 1) {
      |     ^~~
#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...