Submission #849934

# Submission time Handle Problem Language Result Execution time Memory
849934 2023-09-15T14:54:34 Z ogkostya Closing Time (IOI23_closing) C++17
8 / 100
92 ms 28604 KB
#include "closing.h"

#include <vector>
#include <utility>
#include <map>

std::vector<std::pair<int, int>> down[200020];

std::vector<std::pair<long long, int>> build(int N, int X)
{
    std::multimap<long long, int> map = {};
    std::vector<bool> f(N);
    std::vector<std::pair<long long, int>> ans = {};

    f[X] = true;
    map.insert(std::make_pair(0LL, X));
    long long sum = 0;
    while (map.size() > 0)
    {
        std::multimap<long long, int>::iterator it = map.lower_bound(-1);
        long long w = it->first;
        int ii = it->second;
        map.erase(it);

        sum += w;
        ans.push_back(std::make_pair(sum, 1 + ans.size()));

        for (size_t i = 0; i < down[ii].size(); i++)
        {
            if (!f[down[ii][i].first])
            {
                f[down[ii][i].first] = true;
                map.insert(std::make_pair(w + down[ii][i].second, down[ii][i].first));
            }
        }
    }
    return ans;
}


int max_score(int N, int X, int Y, long long K,
    std::vector<int> U, std::vector<int> V, std::vector<int> W)
{
    for (int i = 0; i < N; i++)
    {
        down[i].clear();
    }

    bool lin = true;
    for (size_t i = 0; i < W.size(); i++)
    {
        int a = U[i];
        int b = V[i];

        if (a == i && b == i + 1 || b == i && a == i + 1)
        {

        }
        else
        {
            lin = false;
        }

        down[a].push_back(std::make_pair(b, W[i]));
        down[b].push_back(std::make_pair(a, W[i]));
    }

    std::vector<std::pair<long long, int>> dx = build(N, X);
    std::vector<std::pair<long long, int>> dy = build(N, Y);

    int ans = 0;
    for (size_t i = 0; i < dy.size(); i++)
    {
        if (dy[i].first > K)
            break;
        ans = std::max(ans, dy[i].second);
    }
    int iy = dy.size() - 1;
    for (size_t i = 0; i < dx.size(); i++)
    {
        if (dx[i].first > K)
            break;
        while (iy >= 0 && dx[i].first + dy[iy].first > K)
        {
            iy--;
        }
        if (iy >= 0)
            ans = std::max(ans, dx[i].second + dy[iy].second);
        else
            ans = std::max(ans, dx[i].second);
    }

    if (lin)
    {
        long long sx = 0;
        long long sy = 0;

        int x = X;
        int y = Y;
        long long sum = 0;

        std::vector<int> WW(N);
        int count = 2;
        while (x < y - 1)
        {
            if (sx + W[x] < sy + W[y - 1])
            {
                sum += sx + W[x];
                sx += W[x];
                x++;
                WW[x] = sx;
                count++;
            }
            else
            {
                sum += sy + W[y - 1];
                sy += W[y - 1];
                y--;

                WW[y] = sy;
                count++;
            }
        }

        std::vector <bool> first(N);
        std::vector<std::pair<long long, std::pair<int, int>>> sec(N);
        std::multimap<long long, std::pair<int, int>> map = {};

        if (X > 0)
        {
            map.insert(std::make_pair(0LL + W[X - 1], std::make_pair(X - 1, -1)));
            first[X - 1] = true;
        }
        map.insert(std::make_pair(sx + W[x] - WW[x + 1], std::make_pair(x + 1, 1)));
        first[x] = true;
        if (Y + 1 < N)
        {
            map.insert(std::make_pair(0LL + W[Y], std::make_pair(Y + 1, 1)));
            first[Y + 1] = true;
        }
        map.insert(std::make_pair(sy + W[y - 1] - WW[y - 1], std::make_pair(y - 1, -1)));
        first[y] = true;

        while (map.size() > 0)
        {
            std::multimap<long long, std::pair<int, int>>::iterator it = map.lower_bound(-1);
            long long w = it->first;
            std::pair<int, int> ii = it->second;
            map.erase(it);

            sum += w;
            if (sum > K)
            {
                break;
            }

            if (ii.second == 1)
            {
                x = ii.first;
                w += WW[x];
                WW[x] = w;
                first[x] = false;
                if (sec[x].first != 0)
                {
                    map.insert(std::make_pair(sec[x].first - WW[x], sec[x].second));
                    sec[x].first = 0;
                }
                if (x + 1 < N)
                {
                    if (!first[x + 1])
                    {
                        map.insert(std::make_pair(w + W[x] - WW[x + 1], std::make_pair(x + 1, 1)));
                        first[x + 1] = true;

                    }
                    else
                    {
                        sec[x + 1] = std::make_pair(w + W[x], std::make_pair(x + 1, 1));
                    }
                }
            }
            else
            {
                y = ii.first;
                w += WW[y];
                WW[y] = w;
                first[y] = false;
                if (sec[y].first != 0)
                {
                    map.insert(std::make_pair(sec[y].first - WW[y], sec[y].second));
                    sec[y].first = 0;
                }
                if (y > 0)
                {
                    if (!first[y - 1])
                    {
                        map.insert(std::make_pair(w + W[y - 1] - WW[y - 1], std::make_pair(y - 1, -1)));
                        first[y - 1] = true;

                    }
                    else
                    {
                        sec[y - 1] = (std::make_pair(w + W[y - 1] - WW[y - 1], std::make_pair(y - 1, -1)));
                    }
                }
            }

            count++;
        }

        ans = std::max(ans, count);
    }

    return ans;
}

Compilation message

closing.cpp: In function 'int max_score(int, int, int, long long int, std::vector<int>, std::vector<int>, std::vector<int>)':
closing.cpp:55:15: warning: comparison of integer expressions of different signedness: 'int' and 'size_t' {aka 'long unsigned int'} [-Wsign-compare]
   55 |         if (a == i && b == i + 1 || b == i && a == i + 1)
      |             ~~^~~~
closing.cpp:55:25: warning: comparison of integer expressions of different signedness: 'int' and 'size_t' {aka 'long unsigned int'} [-Wsign-compare]
   55 |         if (a == i && b == i + 1 || b == i && a == i + 1)
      |                       ~~^~~~~~~~
closing.cpp:55:39: warning: comparison of integer expressions of different signedness: 'int' and 'size_t' {aka 'long unsigned int'} [-Wsign-compare]
   55 |         if (a == i && b == i + 1 || b == i && a == i + 1)
      |                                     ~~^~~~
closing.cpp:55:49: warning: comparison of integer expressions of different signedness: 'int' and 'size_t' {aka 'long unsigned int'} [-Wsign-compare]
   55 |         if (a == i && b == i + 1 || b == i && a == i + 1)
      |                                               ~~^~~~~~~~
closing.cpp:55:20: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   55 |         if (a == i && b == i + 1 || b == i && a == i + 1)
      |             ~~~~~~~^~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 4952 KB 1st lines differ - on the 1st token, expected: '6', found: '5'
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 92 ms 26556 KB Output is correct
2 Correct 89 ms 28604 KB Output is correct
3 Correct 59 ms 7756 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 4952 KB Output is correct
2 Correct 2 ms 4956 KB Output is correct
3 Correct 2 ms 4952 KB Output is correct
4 Correct 2 ms 4952 KB Output is correct
5 Incorrect 2 ms 4952 KB 1st lines differ - on the 1st token, expected: '3', found: '16'
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 4952 KB Output is correct
2 Correct 2 ms 4956 KB Output is correct
3 Correct 2 ms 4952 KB Output is correct
4 Correct 2 ms 4952 KB Output is correct
5 Incorrect 2 ms 4952 KB 1st lines differ - on the 1st token, expected: '3', found: '16'
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 4952 KB Output is correct
2 Correct 2 ms 4956 KB Output is correct
3 Correct 2 ms 4952 KB Output is correct
4 Correct 2 ms 4952 KB Output is correct
5 Incorrect 2 ms 4952 KB 1st lines differ - on the 1st token, expected: '3', found: '16'
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 4952 KB 1st lines differ - on the 1st token, expected: '6', found: '5'
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 4952 KB 1st lines differ - on the 1st token, expected: '6', found: '5'
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 4952 KB 1st lines differ - on the 1st token, expected: '6', found: '5'
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 4952 KB 1st lines differ - on the 1st token, expected: '6', found: '5'
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 4952 KB 1st lines differ - on the 1st token, expected: '6', found: '5'
2 Halted 0 ms 0 KB -