Submission #711274

#TimeUsernameProblemLanguageResultExecution timeMemory
711274pls33Swimming competition (LMIO18_plaukimo_varzybos)C++17
100 / 100
1243 ms178360 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

#pragma region dalykai

template <typename F>
void _debug(F f)
{
    f();
}

#ifndef _AAAAAAAAA
#define debug(x)
#else
#define debug(x) _debug(x)
#endif

using p32 = pair<int, int>;
using p32u = pair<uint32_t, uint32_t>;
using p64 = pair<int64_t, int64_t>;
using p64u = pair<uint64_t, uint64_t>;
using vi16 = vector<int16_t>;
using vi16u = vector<uint16_t>;
using vi32 = vector<int>;
using vi32u = vector<uint32_t>;
using vi64 = vector<int64_t>;
using vi64u = vector<uint64_t>;
using vp32 = vector<p32>;
using vp32u = vector<p32u>;
using vp64 = vector<p64>;
using vp64u = vector<p64u>;
using vvi32 = vector<vi32>;
using vvi32u = vector<vi32u>;
using vvi64 = vector<vi64>;
using vvi64u = vector<vi64u>;
using vvp32 = vector<vp32>;
using vvp32u = vector<vp32u>;
using vvp64 = vector<vp64>;
using vvp64u = vector<vp64u>;

#pragma endregion

using change_t = vector<vector<pair<int, bool>>>;
void fix_multisets(int i,
                   change_t &insert, change_t &erase,
                   multiset<int> &opt, multiset<int> &diff)
{
    for (auto &[val, which] : insert[i])
    {
        if (which)
        {
            opt.insert(val);
        }
        else
        {
            diff.insert(val);
        }
    }
    for (auto &[val, which] : erase[i])
    {
        if (which)
        {
            auto it = opt.find(val);
            opt.erase(it);
        }
        else
        {
            auto it = diff.find(val);
            diff.erase(it);
        }
    }
}

int main()
{
#ifndef _AAAAAAAAA
    // freopen("lmio_2018_3e2_plaukimo_varzybos_vyr.in", "r", stdin);
    // freopen("lmio_2018_3e2_plaukimo_varzybos_vyr.out", "w", stdout);
    //  ios_base::sync_with_stdio(false);
    //  cin.tie(0);
#else
    freopen("swim.in", "r", stdin);
#ifndef __linux__
    atexit([]()
           {
        freopen("con", "r", stdin);
        system("pause"); });
#endif
#endif

    int n, l, u;
    cin >> n >> l >> u;

    vi32 nums(n);
    for (int i = 0; i < n; i++)
    {
        cin >> nums[i];
    }

    sort(nums.begin(), nums.end());

    vi32 dp(n, INT_MAX);
    vvp32 change(n + 1);

    // true jei is opt
    vector<vector<pair<int, bool>>> erase(n + 1), insert(n + 1);

    multiset<int> opt, diff;

    insert[min(n, l - 1)].emplace_back(nums[0], false);
    erase[min(n, u)].emplace_back(nums[0], false);
    fix_multisets(0, insert, erase, opt, diff);

    // kazkaip reikia pradzia (i = 0) sutvarkyt

    for (int i = 1; i < n; i++)
    {
        fix_multisets(i, insert, erase, opt, diff);
        if (opt.size())
        {
            dp[i] = min(dp[i], *opt.begin());
        }
        if (diff.size())
        {
            dp[i] = min(dp[i], nums[i] - *diff.rbegin());
        }

        if (i >= n - 1 || dp[i] == INT_MAX)
        {
            continue;
        }

        int bound = dp[i] + nums[i + 1];
        int lower = min(n, i + l);
        int upper = min(n, i + u);

        if (lower == n)
        {
            continue;
        }

        bound = (int)distance(nums.begin(), upper_bound(nums.begin(), nums.end(), bound));

        if (bound < lower)
        {
            insert[min(n, lower)].emplace_back(nums[i + 1], false);
            erase[min(n, upper + 1)].emplace_back(nums[i + 1], false);
            continue;
        }

        insert[lower].emplace_back(dp[i], true);
        if (bound > upper)
        {
            erase[min(n, upper + 1)].emplace_back(dp[i], true);
        }
        else
        {
            erase[bound].emplace_back(dp[i], true);
            insert[bound].emplace_back(nums[i + 1], false);
            erase[min(n, upper + 1)].emplace_back(nums[i + 1], false);
        }
    }

    debug([&]()
          {
              for (auto &a : dp)
              {
                  cout << a << ' ';
              }
              cout << '\n';
              //
          });

    cout << dp.back() << '\n';

    return 0;
}

Compilation message (stderr)

plaukimo_varzybos.cpp:8: warning: ignoring '#pragma region dalykai' [-Wunknown-pragmas]
    8 | #pragma region dalykai
      | 
plaukimo_varzybos.cpp:45: warning: ignoring '#pragma endregion ' [-Wunknown-pragmas]
   45 | #pragma endregion
      |
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...