Submission #771316

#TimeUsernameProblemLanguageResultExecution timeMemory
771316caganyanmaz선물상자 (IOI15_boxes)C++17
100 / 100
551 ms293896 KiB
#include <bits/stdc++.h>
#define pb push_back
#define DEBUGGING
#define f first
#define s second
#define int int64_t
#ifdef DEBUGGING
#define debug(x) cout << (#x) << ": " << (x) << "\n";
#else
#define debug(x) 42
#endif
using namespace std;

constexpr static int MXSIZE = 1e7 + 2;
int left_dp[MXSIZE];
int right_dp[MXSIZE];
vector<int> left_val;
vector<int> right_val;
int mid = 0;

bool inleft(int pos, int L)
{
        if (L&1)
                return pos <= (L/2);
        else
                return pos < (L/2);

}

int delivery(int32_t N, int32_t K, int32_t L, int32_t p[])
{
        for (int i = 0; i < N; i++)
                if (inleft(p[i], L))
                        left_val.pb(p[i]);
                else if (p[i] > (L / 2))
                        right_val.pb(p[i]);
                else
                        mid++;
        reverse(right_val.begin(), right_val.end());
        for (int i = 1; i <= left_val.size(); i++)
        {
                if (i - K >= 0)
                        left_dp[i] = left_dp[i-K];
                left_dp[i] += left_val[i-1] * 2;
        }
        for (int i = 1; i <= right_val.size(); i++)
        {
                if (i - K >= 0)
                        right_dp[i] = right_dp[i-K];
                right_dp[i] += (L - right_val[i-1]) * 2;
        }
        int res = left_dp[left_val.size()] + right_dp[right_val.size()] + (mid/K) * L;
        if ((mid%K) != 0)
                res += L;
        if (K==1)
                return res;
        for (int j = 1; j <= 4; j++)
        {
                int lo = K * j - (mid % K);
                for (int i = 0; i <= lo; i++)
                        if (left_val.size() >= i && right_val.size() >= lo-i)
                                res = min(res, left_dp[left_val.size()-i] + right_dp[right_val.size()-lo+i] + ((mid+lo)/K) * L);
        }
        return res;
}

Compilation message (stderr)

boxes.cpp: In function 'int64_t delivery(int32_t, int32_t, int32_t, int32_t*)':
boxes.cpp:40:27: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |         for (int i = 1; i <= left_val.size(); i++)
      |                         ~~^~~~~~~~~~~~~~~~~~
boxes.cpp:46:27: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   46 |         for (int i = 1; i <= right_val.size(); i++)
      |                         ~~^~~~~~~~~~~~~~~~~~~
boxes.cpp:61:45: warning: comparison of integer expressions of different signedness: 'std::vector<long int>::size_type' {aka 'long unsigned int'} and 'int64_t' {aka 'long int'} [-Wsign-compare]
   61 |                         if (left_val.size() >= i && right_val.size() >= lo-i)
      |                             ~~~~~~~~~~~~~~~~^~~~
boxes.cpp:61:70: warning: comparison of integer expressions of different signedness: 'std::vector<long int>::size_type' {aka 'long unsigned int'} and 'int64_t' {aka 'long int'} [-Wsign-compare]
   61 |                         if (left_val.size() >= i && right_val.size() >= lo-i)
      |                                                     ~~~~~~~~~~~~~~~~~^~~~~~~
#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...