제출 #724151

#제출 시각아이디문제언어결과실행 시간메모리
724151danikoynovPainting Walls (APIO20_paint)C++14
63 / 100
779 ms524288 KiB
#include "paint.h"

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10, maxk = 1e5 + 10;

int dp[maxn], c[maxn], a[maxn / 2], n, m;
vector < int > b[maxn / 2], col[maxn];
vector < pair < int, unsigned int > > path[maxn];
int minimumInstructions(
    int N, int M, int K, vector<int> C,
    vector<int> A, vector<vector<int>> B)
{

    n = N;
    m = M;
    for (int i = 0; i < n; i ++)
    {
        c[i] = C[i];
    }

    for (int i = 0; i < m; i ++)
    {
        a[i] = A[i];
        for (int j = 0; j < a[i]; j ++)
        {
            b[i].push_back(B[i][j]);
            col[b[i][j]].push_back(i);
        }
    }

    for (int i = 0; i < N; i ++)
        dp[i] = 1e9;


    deque < pair < int, int > > dq;
    dq.push_back({N, 0});
    for (int i = N - 1; i >= 0; i --)
    {
                for (int idx : col[c[i]])
            path[i].push_back({idx, 1});
            path[i + 2].clear();
        /**bool tf = false;
        for (int st = 0; st < M; st ++)
        {
            bool is_pos = true;
            for (int pos = 0; pos < M; pos ++)
            {
                if (col[c[i + pos]][(st + pos) % M] == 0)
                {
                    ///cout << "break " << pos << endl;
                    is_pos = false;
                    break;
                }
            }
            if (is_pos)
            {
                ///cout << i << " " << st << endl;
                tf = true;
                break;
            }
        }*/

        bool tf = false;
        int pt = 0;
        for (int j = 0; j < path[i].size(); j ++)
        {
            while(pt < path[i + 1].size() && path[i + 1][pt].first <= path[i][j].first)
                pt ++;

            if (pt != path[i + 1].size() && path[i + 1][pt].first == path[i][j].first + 1)
                path[i][j].second = max(path[i][j].second, min(path[i + 1][pt].second + 1, (unsigned)m));
            if (path[i][j].first == M - 1)
            {
                if (path[i + 1].size() > 0 && path[i + 1][0].first == 0)
                {
                    path[i][j].second = max(path[i][j].second, min(path[i + 1][0].second + 1, (unsigned)m));
                }
            }

            if (path[i][j].second == m)
                tf = true;

            ///cout << i << " : " << path[i][j].first << " " << path[i][j].second << endl;
        }



        while(!dq.empty() && dq.front().first > i + M)
            dq.pop_front();///, cout << "rem " << dq.front().first << endl;

        if (tf)
        {
            ///cout << "here " << i << " " << dq.front().first << endl;
            dp[i] = dq.front().second + 1;
            //for (int j = i + 1; j <= i + M; j ++)
            //  dp[i] = min(dp[i], dp[j] + 1);

        }

        while(!dq.empty() && dq.back().second >= dp[i])
            dq.pop_back();
        dq.push_back({i, dp[i]});
    }

    if (dp[0] > N)
        return -1;
    return dp[0];
}

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

paint.cpp: In function 'int minimumInstructions(int, int, int, std::vector<int>, std::vector<int>, std::vector<std::vector<int> >)':
paint.cpp:67:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, unsigned int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |         for (int j = 0; j < path[i].size(); j ++)
      |                         ~~^~~~~~~~~~~~~~~~
paint.cpp:69:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, unsigned int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |             while(pt < path[i + 1].size() && path[i + 1][pt].first <= path[i][j].first)
      |                   ~~~^~~~~~~~~~~~~~~~~~~~
paint.cpp:72:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, unsigned int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |             if (pt != path[i + 1].size() && path[i + 1][pt].first == path[i][j].first + 1)
      |                 ~~~^~~~~~~~~~~~~~~~~~~~~
paint.cpp:82:35: warning: comparison of integer expressions of different signedness: 'unsigned int' and 'int' [-Wsign-compare]
   82 |             if (path[i][j].second == m)
#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...