답안 #705218

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
705218 2023-03-03T15:37:08 Z danikoynov 메기 농장 (IOI22_fish) C++17
61 / 100
753 ms 332040 KB
#include "fish.h"

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

const int maxn = 1e5 + 10, smalln = 3010;

vector < pair < int, int > > col[maxn];
vector < int > state[maxn];
 unordered_set < int >  state_set[maxn];
ll dp[smalln][smalln][2];
ll val[smalln][smalln], pref[smalln][smalln];

ll get_sum(int col, int left, int right)
{
    ll sum = pref[col][right];
    if (left > 0)
        sum = sum - pref[col][left - 1];
    return sum;
}

long long max_weights(int N, int M, std::vector<int> X, std::vector<int> Y,
                      std::vector<int> W)
{
    bool all_even = true, small_x = true;
    for (int i = 0; i < M; i ++)
    {
        if (X[i] % 2 != 0)
            all_even = false;
        if (X[i] > 1)
            small_x = false;
    }

    for (int i = 0; i < M; i ++)
    {
        col[X[i]].push_back({Y[i], W[i]});
    }

    for (int i = 0; i < N; i ++)
        sort(col[i].begin(), col[i].end());

    for (int i = 0; i < M; i ++)
    {
        if (X[i] != 0)
            state_set[X[i] - 1].insert(Y[i] + 1);
        if (X[i] != N - 1)
        state_set[X[i] + 1].insert(Y[i] + 1);
    }

    for (int i = 0; i < N; i ++)
    {
        state_set[i].insert(0);
        state_set[i].insert(N);
    }
    for (int i = 0; i < N; i ++)
    {
        for (auto it : state_set[i])
            state[i].push_back(it);
        sort(state[i].begin(), state[i].end());
    }

    if (all_even)
    {
        ll sum = 0;
        for (int i = 0; i < M; i ++)
            sum = sum + W[i];
        return sum;

    }
    else if (small_x)
    {

        ll zero = 0, one = 0;
        for (int i = 0; i < M; i ++)
        {
            if (X[i] == 0)
                zero += W[i];
            else
                one += W[i];
        }
        if (N == 2)
            return max(zero, one);

        int to = 0;
        ll cur = 0, ans = 0;
        for (int i = 0; i < col[0].size(); i ++)
        {
            if (cur + one > ans)
                ans = cur + one;
            cur += col[0][i].second;
            while(to < col[1].size() && col[1][to].first <= col[0][i].first)
            {
                one -= col[1][to].second;
                to ++;
            }
        }
        if (cur + one > ans)
            ans = cur + one;
        return ans;

    }

    for (int i = 0; i < M; i ++)
        val[X[i]][Y[i]] = W[i];

    /**for (int i = 0; i < N; i ++, cout << endl)
        for (int j = 0; j < N; j ++)
        cout << val[i][j] << " ";*/
    for (int j = 0; j <= N; j ++)
        dp[1][j][0] = dp[1][j][1] = 0;

    for (int i = 0; i < N; i ++)
    {
        pref[i][0] = val[i][0];
        for (int j = 1; j <= N; j ++)
        {
            pref[i][j] = pref[i][j - 1] + val[i][j];
        }
    }
    for (int i = 1; i < N; i ++)
    {

        dp[i][0][1] = dp[i - 1][0][1];
        for (int j = 1; j <= N; j ++)
        {
            dp[i][j][1] = max(dp[i][j - 1][1] + val[i - 1][j - 1], dp[i - 1][j][1]);
        }
        dp[i][N][0] = max(dp[i - 1][N][0], dp[i - 1][N][1]);
        for (int j = N - 1; j >= 0; j --)
        {
            dp[i][j][0] = max(dp[i][j + 1][0] + val[i][j], max(dp[i - 1][j][0], dp[i - 1][j][1]));
        }

        if (i > 1)
        {

            ll best = max(dp[i - 2][0][0], dp[i - 2][0][1]);
            for (int j = 1; j <= N; j ++)
            {
                best = max(best, max(dp[i - 2][j][0], dp[i - 2][j][1]));
                dp[i][j][1] = max(best + get_sum(i - 1, 0, j - 1), dp[i][j][1]);

            }
            best = max(dp[i - 2][N][0], dp[i - 2][N][1]) + get_sum(i - 1, 0, N - 1);
            for (int j = N; j > 0; j --)
            {
                best = max(best, max(dp[i - 2][j][0], dp[i - 2][j][1]) + get_sum(i - 1, 0, j - 1));
                dp[i][j][1] = max(best, dp[i][j][1]);

            }
        }

        for (int j = 0; j <= N; j ++)
        {
            if (state_set[i].find(j) == state_set[i].end())
                dp[i][j][0] = dp[i][j][1] = 0;
            //else
              // cout << i << " " << j << " " << dp[i][j][0] << endl;
        }
    }

    /**cout << "-----------" << endl;
    for (int i = 0; i < N; i ++, cout << endl)
        for (int j = 0; j <= N; j ++)
        cout << dp[i][j][0] << " ";
    cout << "-----------" << endl;
    for (int i = 0; i < N; i ++, cout << endl)
        for (int j = 0; j <= N; j ++)
        cout << dp[i][j][1] << " ";*/
    ll ans = 0;
    for (int j = 0; j <= N; j ++)
        for (int t = 0; t < 2; t ++)
            ans = max(ans, dp[N - 1][j][t]);


    return ans;

}

Compilation message

fish.cpp: In function 'long long int max_weights(int, int, std::vector<int>, std::vector<int>, std::vector<int>)':
fish.cpp:87:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   87 |         for (int i = 0; i < col[0].size(); i ++)
      |                         ~~^~~~~~~~~~~~~~~
fish.cpp:92:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   92 |             while(to < col[1].size() && col[1][to].first <= col[0][i].first)
      |                   ~~~^~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 83 ms 35312 KB Output is correct
2 Correct 97 ms 39328 KB Output is correct
3 Correct 38 ms 30772 KB Output is correct
4 Correct 39 ms 30736 KB Output is correct
5 Correct 437 ms 71464 KB Output is correct
6 Correct 524 ms 67736 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 10452 KB Output is correct
2 Correct 154 ms 44908 KB Output is correct
3 Correct 198 ms 52236 KB Output is correct
4 Correct 91 ms 35328 KB Output is correct
5 Correct 112 ms 39468 KB Output is correct
6 Correct 6 ms 10452 KB Output is correct
7 Correct 6 ms 10488 KB Output is correct
8 Correct 7 ms 10440 KB Output is correct
9 Correct 6 ms 10452 KB Output is correct
10 Correct 40 ms 30704 KB Output is correct
11 Correct 36 ms 30704 KB Output is correct
12 Correct 95 ms 38900 KB Output is correct
13 Correct 125 ms 44304 KB Output is correct
14 Correct 88 ms 36852 KB Output is correct
15 Correct 100 ms 40876 KB Output is correct
16 Correct 89 ms 37116 KB Output is correct
17 Correct 102 ms 40908 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 30796 KB Output is correct
2 Runtime error 62 ms 62312 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 10504 KB Output is correct
2 Correct 6 ms 10580 KB Output is correct
3 Correct 6 ms 10488 KB Output is correct
4 Correct 6 ms 10452 KB Output is correct
5 Correct 6 ms 10440 KB Output is correct
6 Correct 6 ms 10488 KB Output is correct
7 Correct 6 ms 10492 KB Output is correct
8 Correct 7 ms 10492 KB Output is correct
9 Correct 8 ms 12884 KB Output is correct
10 Correct 11 ms 16448 KB Output is correct
11 Correct 7 ms 12928 KB Output is correct
12 Correct 10 ms 16340 KB Output is correct
13 Correct 7 ms 11512 KB Output is correct
14 Correct 12 ms 16384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 10504 KB Output is correct
2 Correct 6 ms 10580 KB Output is correct
3 Correct 6 ms 10488 KB Output is correct
4 Correct 6 ms 10452 KB Output is correct
5 Correct 6 ms 10440 KB Output is correct
6 Correct 6 ms 10488 KB Output is correct
7 Correct 6 ms 10492 KB Output is correct
8 Correct 7 ms 10492 KB Output is correct
9 Correct 8 ms 12884 KB Output is correct
10 Correct 11 ms 16448 KB Output is correct
11 Correct 7 ms 12928 KB Output is correct
12 Correct 10 ms 16340 KB Output is correct
13 Correct 7 ms 11512 KB Output is correct
14 Correct 12 ms 16384 KB Output is correct
15 Correct 10 ms 16244 KB Output is correct
16 Correct 8 ms 11592 KB Output is correct
17 Correct 38 ms 21044 KB Output is correct
18 Correct 35 ms 20748 KB Output is correct
19 Correct 37 ms 21348 KB Output is correct
20 Correct 37 ms 20848 KB Output is correct
21 Correct 35 ms 20812 KB Output is correct
22 Correct 60 ms 25268 KB Output is correct
23 Correct 17 ms 18176 KB Output is correct
24 Correct 38 ms 20708 KB Output is correct
25 Correct 12 ms 16340 KB Output is correct
26 Correct 17 ms 17716 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 10504 KB Output is correct
2 Correct 6 ms 10580 KB Output is correct
3 Correct 6 ms 10488 KB Output is correct
4 Correct 6 ms 10452 KB Output is correct
5 Correct 6 ms 10440 KB Output is correct
6 Correct 6 ms 10488 KB Output is correct
7 Correct 6 ms 10492 KB Output is correct
8 Correct 7 ms 10492 KB Output is correct
9 Correct 8 ms 12884 KB Output is correct
10 Correct 11 ms 16448 KB Output is correct
11 Correct 7 ms 12928 KB Output is correct
12 Correct 10 ms 16340 KB Output is correct
13 Correct 7 ms 11512 KB Output is correct
14 Correct 12 ms 16384 KB Output is correct
15 Correct 10 ms 16244 KB Output is correct
16 Correct 8 ms 11592 KB Output is correct
17 Correct 38 ms 21044 KB Output is correct
18 Correct 35 ms 20748 KB Output is correct
19 Correct 37 ms 21348 KB Output is correct
20 Correct 37 ms 20848 KB Output is correct
21 Correct 35 ms 20812 KB Output is correct
22 Correct 60 ms 25268 KB Output is correct
23 Correct 17 ms 18176 KB Output is correct
24 Correct 38 ms 20708 KB Output is correct
25 Correct 12 ms 16340 KB Output is correct
26 Correct 17 ms 17716 KB Output is correct
27 Correct 237 ms 235552 KB Output is correct
28 Correct 191 ms 54484 KB Output is correct
29 Correct 562 ms 260696 KB Output is correct
30 Correct 753 ms 306524 KB Output is correct
31 Correct 723 ms 307512 KB Output is correct
32 Correct 237 ms 54860 KB Output is correct
33 Correct 744 ms 332040 KB Output is correct
34 Correct 736 ms 331820 KB Output is correct
35 Correct 418 ms 252892 KB Output is correct
36 Correct 612 ms 275464 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 30796 KB Output is correct
2 Runtime error 62 ms 62312 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 83 ms 35312 KB Output is correct
2 Correct 97 ms 39328 KB Output is correct
3 Correct 38 ms 30772 KB Output is correct
4 Correct 39 ms 30736 KB Output is correct
5 Correct 437 ms 71464 KB Output is correct
6 Correct 524 ms 67736 KB Output is correct
7 Correct 6 ms 10452 KB Output is correct
8 Correct 154 ms 44908 KB Output is correct
9 Correct 198 ms 52236 KB Output is correct
10 Correct 91 ms 35328 KB Output is correct
11 Correct 112 ms 39468 KB Output is correct
12 Correct 6 ms 10452 KB Output is correct
13 Correct 6 ms 10488 KB Output is correct
14 Correct 7 ms 10440 KB Output is correct
15 Correct 6 ms 10452 KB Output is correct
16 Correct 40 ms 30704 KB Output is correct
17 Correct 36 ms 30704 KB Output is correct
18 Correct 95 ms 38900 KB Output is correct
19 Correct 125 ms 44304 KB Output is correct
20 Correct 88 ms 36852 KB Output is correct
21 Correct 100 ms 40876 KB Output is correct
22 Correct 89 ms 37116 KB Output is correct
23 Correct 102 ms 40908 KB Output is correct
24 Correct 37 ms 30796 KB Output is correct
25 Runtime error 62 ms 62312 KB Execution killed with signal 11
26 Halted 0 ms 0 KB -