답안 #702591

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
702591 2023-02-24T13:44:53 Z boris_mihov 메기 농장 (IOI22_fish) C++17
18 / 100
286 ms 118268 KB
#include "fish.h"
#include <algorithm>
#include <iostream>
#include <cassert>
#include <numeric>
#include <vector>

#pragma GCC optimize ("Ofast,fast-math")
#pragma GCC target ("sse4")

typedef long long llong;
const int MAXN = 100000 + 10;
const int MAXM = 600000 + 10;
 
struct Position
{
    int y;
    int idx;
    llong in;
    llong left;
    llong right;
 
    Position(int _y, int _idx, llong _in, llong _left, llong _right)
    {
        y = _y;
        idx = _idx;
        left = _left;
        right = _right;
        in = _in;
    }
};
 
int cnt;
int n, m;
llong dp[MAXM][2];
std::vector <Position> pos[MAXN];
std::vector <Position> posUncleared[MAXN];
std::vector <std::pair <int,int>> fish[MAXN];
std::vector <llong> minusIN[MAXN];
std::vector <llong> minusL[MAXN];
std::vector <llong> LR[MAXN];
 
llong max_weights(int N, int M, std::vector <int> X, std::vector <int> Y, std::vector <int> W) 
{
    n = N; m = M;   
    for (int i = 0 ; i < m ; ++i)
    {
        fish[X[i] + 1].emplace_back(Y[i] + 1, W[i]);
    }
 
    for (int x = 1 ; x <= n ; ++x)
    {
        std::sort(fish[x].begin(), fish[x].end());
        for (const auto &[y, w] : fish[x])
        {
            if (x != 1)
            {
                posUncleared[x - 1].push_back({y, 0, 0LL, 0LL, 0LL});
            }
 
            if (x != n)
            {
                posUncleared[x + 1].push_back({y, 0, 0LL, 0LL, 0LL});
            }
        }
    }
 
    for (int x = 1 ; x <= n ; ++x)
    {
        std::sort(posUncleared[x].begin(), posUncleared[x].end(), [&](Position a, Position b)
        {
            return a.y < b.y;
        });
        
        for (Position p : posUncleared[x])
        {
            if (!pos[x].empty() && pos[x].back().y == p.y)
            {
                continue;
            }
 
            pos[x].push_back(p);
        }
 
        int ptrL = 0;
        int ptrR = 0;
        int ptrIN = 0;
        llong inSum = 0;
        llong leftSum = 0;
        llong rightSum = 0;
        for (Position &p : pos[x])
        {
            while (ptrL < fish[x - 1].size() && fish[x - 1][ptrL].first <= p.y)
            {
                leftSum += fish[x - 1][ptrL].second;
                ptrL++;
            }
 
            while (ptrR < fish[x + 1].size() && fish[x + 1][ptrR].first <= p.y)
            {
                rightSum += fish[x + 1][ptrR].second;
                ptrR++;
            }
 
            while (ptrIN < fish[x].size() && fish[x][ptrIN].first <= p.y)
            {
                inSum += fish[x][ptrIN].second;
                ptrIN++;
            }
 
            p.in = inSum;
            p.left = leftSum;
            p.right = rightSum;
        }
    }
    
    for (int x = 1 ; x <= n ; ++x)
    {
        for (Position &p : pos[x])
        {
            p.idx = ++cnt;
        }
    }

    llong max = 0;
    for (int x = n ; x >= 1 ; --x)
    {
        if (x + 3 <= n)
        {
            for (const Position &curr : pos[x + 3])
            {
                max = std::max(max, dp[curr.idx][0] + curr.left + curr.right);
            }
        }
        
        for (int type = 0 ; type < 2 ; ++type)
        {
            for (const Position &curr : pos[x])
            {
                if (x == n)
                {
                    continue;
                }

                dp[curr.idx][type] = max;
                int l = -1, r = pos[x + 1].size(), mid;
                while (l < r - 1)
                {
                    mid = (l + r) >> 1;
                    if (pos[x + 1][mid].y < curr.y) l = mid;
                    else r = mid;
                }
 
                if (l >= 0)
                {
                    dp[curr.idx][type] = std::max(dp[curr.idx][type], minusIN[x + 1][l]);
                }
 
                if (r < pos[x + 1].size() && type == 0)
                {
                    dp[curr.idx][type] = std::max(dp[curr.idx][type], LR[x + 1][r] - curr.in - curr.right);
                }
 
                if (x + 2 <= n)
                {
                    l = -1;
                    r = pos[x + 2].size();
                    while (l < r - 1)
                    {
                        mid = (l + r) >> 1;
                        if (pos[x + 2][mid].y < curr.y) l = mid;
                        else r = mid;
                    }
 
                    if (l >= 0)
                    {
                        dp[curr.idx][type] = std::max(dp[curr.idx][type], minusL[x + 2][l]);
                    }
 
                    if (r < pos[x + 2].size())
                    {
                        dp[curr.idx][type] = std::max(dp[curr.idx][type], LR[x + 2][r] - curr.right);
                    }
                }
            }

            LR[x].reserve(pos[x].size());
            minusL[x].reserve(pos[x].size());
            minusIN[x].reserve(pos[x].size());
            for (const Position &curr : pos[x])
            {
                minusIN[x].push_back(dp[curr.idx][1] - curr.in + curr.right);
                LR[x].push_back(dp[curr.idx][0] + curr.left + curr.right);
                minusL[x].push_back(dp[curr.idx][0] + curr.right);
            }

            for (int i = 1 ; i < pos[x].size() ; ++i)
            {
                minusIN[x][i] = std::max(minusIN[x][i - 1], minusIN[x][i]);
                minusL[x][i] = std::max(minusIN[x][i - 1], minusL[x][i]);
            }

            for (int i = (int)pos[x].size() - 2 ; i >= 0 ; --i)
            {
                LR[x][i] = std::max(LR[x][i], LR[x][i + 1]);
            }
        }
    }

    for (int x = std::min(n, 3) ; x >= 1 ; --x)
    {
        for (const Position &curr : pos[x])
        {
            max = std::max(max, dp[curr.idx][0] + curr.left + curr.right);
        }
    }
 
    return max;
}

Compilation message

fish.cpp: In function 'llong max_weights(int, int, std::vector<int>, std::vector<int>, std::vector<int>)':
fish.cpp:93:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   93 |             while (ptrL < fish[x - 1].size() && fish[x - 1][ptrL].first <= p.y)
      |                    ~~~~~^~~~~~~~~~~~~~~~~~~~
fish.cpp:99:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   99 |             while (ptrR < fish[x + 1].size() && fish[x + 1][ptrR].first <= p.y)
      |                    ~~~~~^~~~~~~~~~~~~~~~~~~~
fish.cpp:105:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  105 |             while (ptrIN < fish[x].size() && fish[x][ptrIN].first <= p.y)
      |                    ~~~~~~^~~~~~~~~~~~~~~~
fish.cpp:159:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Position>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  159 |                 if (r < pos[x + 1].size() && type == 0)
      |                     ~~^~~~~~~~~~~~~~~~~~~
fish.cpp:180:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Position>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  180 |                     if (r < pos[x + 2].size())
      |                         ~~^~~~~~~~~~~~~~~~~~~
fish.cpp:197:32: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Position>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  197 |             for (int i = 1 ; i < pos[x].size() ; ++i)
      |                              ~~^~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 53 ms 28936 KB Output is correct
2 Correct 63 ms 32328 KB Output is correct
3 Correct 11 ms 14292 KB Output is correct
4 Correct 10 ms 14396 KB Output is correct
5 Correct 250 ms 102460 KB Output is correct
6 Correct 286 ms 118268 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 14292 KB Output is correct
2 Correct 137 ms 51104 KB Output is correct
3 Correct 164 ms 60548 KB Output is correct
4 Correct 53 ms 28868 KB Output is correct
5 Correct 62 ms 32332 KB Output is correct
6 Correct 8 ms 14292 KB Output is correct
7 Correct 9 ms 14292 KB Output is correct
8 Correct 7 ms 14288 KB Output is correct
9 Correct 8 ms 14404 KB Output is correct
10 Correct 14 ms 14364 KB Output is correct
11 Correct 11 ms 14292 KB Output is correct
12 Correct 76 ms 39176 KB Output is correct
13 Correct 91 ms 44864 KB Output is correct
14 Correct 67 ms 33492 KB Output is correct
15 Correct 89 ms 35856 KB Output is correct
16 Correct 69 ms 33596 KB Output is correct
17 Correct 75 ms 35356 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 14292 KB Output is correct
2 Correct 10 ms 14292 KB Output is correct
3 Correct 54 ms 30656 KB Output is correct
4 Correct 47 ms 25548 KB Output is correct
5 Correct 102 ms 43340 KB Output is correct
6 Correct 103 ms 43312 KB Output is correct
7 Correct 92 ms 43336 KB Output is correct
8 Correct 93 ms 43352 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 14292 KB Output is correct
2 Correct 8 ms 14292 KB Output is correct
3 Correct 8 ms 14292 KB Output is correct
4 Correct 9 ms 14292 KB Output is correct
5 Correct 8 ms 14352 KB Output is correct
6 Correct 8 ms 14292 KB Output is correct
7 Correct 9 ms 14388 KB Output is correct
8 Correct 8 ms 14292 KB Output is correct
9 Correct 8 ms 14424 KB Output is correct
10 Incorrect 10 ms 14804 KB 1st lines differ - on the 1st token, expected: '799839985182', found: '799098388912'
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 14292 KB Output is correct
2 Correct 8 ms 14292 KB Output is correct
3 Correct 8 ms 14292 KB Output is correct
4 Correct 9 ms 14292 KB Output is correct
5 Correct 8 ms 14352 KB Output is correct
6 Correct 8 ms 14292 KB Output is correct
7 Correct 9 ms 14388 KB Output is correct
8 Correct 8 ms 14292 KB Output is correct
9 Correct 8 ms 14424 KB Output is correct
10 Incorrect 10 ms 14804 KB 1st lines differ - on the 1st token, expected: '799839985182', found: '799098388912'
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 14292 KB Output is correct
2 Correct 8 ms 14292 KB Output is correct
3 Correct 8 ms 14292 KB Output is correct
4 Correct 9 ms 14292 KB Output is correct
5 Correct 8 ms 14352 KB Output is correct
6 Correct 8 ms 14292 KB Output is correct
7 Correct 9 ms 14388 KB Output is correct
8 Correct 8 ms 14292 KB Output is correct
9 Correct 8 ms 14424 KB Output is correct
10 Incorrect 10 ms 14804 KB 1st lines differ - on the 1st token, expected: '799839985182', found: '799098388912'
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 14292 KB Output is correct
2 Correct 10 ms 14292 KB Output is correct
3 Correct 54 ms 30656 KB Output is correct
4 Correct 47 ms 25548 KB Output is correct
5 Correct 102 ms 43340 KB Output is correct
6 Correct 103 ms 43312 KB Output is correct
7 Correct 92 ms 43336 KB Output is correct
8 Correct 93 ms 43352 KB Output is correct
9 Correct 114 ms 52632 KB Output is correct
10 Incorrect 81 ms 37840 KB 1st lines differ - on the 1st token, expected: '36454348383152', found: '36364983059693'
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 53 ms 28936 KB Output is correct
2 Correct 63 ms 32328 KB Output is correct
3 Correct 11 ms 14292 KB Output is correct
4 Correct 10 ms 14396 KB Output is correct
5 Correct 250 ms 102460 KB Output is correct
6 Correct 286 ms 118268 KB Output is correct
7 Correct 8 ms 14292 KB Output is correct
8 Correct 137 ms 51104 KB Output is correct
9 Correct 164 ms 60548 KB Output is correct
10 Correct 53 ms 28868 KB Output is correct
11 Correct 62 ms 32332 KB Output is correct
12 Correct 8 ms 14292 KB Output is correct
13 Correct 9 ms 14292 KB Output is correct
14 Correct 7 ms 14288 KB Output is correct
15 Correct 8 ms 14404 KB Output is correct
16 Correct 14 ms 14364 KB Output is correct
17 Correct 11 ms 14292 KB Output is correct
18 Correct 76 ms 39176 KB Output is correct
19 Correct 91 ms 44864 KB Output is correct
20 Correct 67 ms 33492 KB Output is correct
21 Correct 89 ms 35856 KB Output is correct
22 Correct 69 ms 33596 KB Output is correct
23 Correct 75 ms 35356 KB Output is correct
24 Correct 11 ms 14292 KB Output is correct
25 Correct 10 ms 14292 KB Output is correct
26 Correct 54 ms 30656 KB Output is correct
27 Correct 47 ms 25548 KB Output is correct
28 Correct 102 ms 43340 KB Output is correct
29 Correct 103 ms 43312 KB Output is correct
30 Correct 92 ms 43336 KB Output is correct
31 Correct 93 ms 43352 KB Output is correct
32 Correct 7 ms 14292 KB Output is correct
33 Correct 8 ms 14292 KB Output is correct
34 Correct 8 ms 14292 KB Output is correct
35 Correct 9 ms 14292 KB Output is correct
36 Correct 8 ms 14352 KB Output is correct
37 Correct 8 ms 14292 KB Output is correct
38 Correct 9 ms 14388 KB Output is correct
39 Correct 8 ms 14292 KB Output is correct
40 Correct 8 ms 14424 KB Output is correct
41 Incorrect 10 ms 14804 KB 1st lines differ - on the 1st token, expected: '799839985182', found: '799098388912'
42 Halted 0 ms 0 KB -