답안 #947123

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
947123 2024-03-15T14:18:23 Z Nhoksocqt1 메기 농장 (IOI22_fish) C++17
32 / 100
287 ms 224088 KB
#include<bits/stdc++.h>
using namespace std;

#define inf 0x3f3f3f3f
#define sz(x) int((x).size())
#define fi first
#define se second
typedef long long ll;
typedef pair<int, int> ii;

template<class X, class Y>
	inline bool maximize(X &x, const Y &y) {return (x < y ? x = y, 1 : 0);}
template<class X, class Y>
	inline bool minimize(X &x, const Y &y) {return (x > y ? x = y, 1 : 0);}

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int Random(int l, int r) {
    return uniform_int_distribution<int>(l, r)(rng);
}

const int MAXN = 100005;

struct Fish {
    int x, y, w;
} fish[3 * MAXN];

ll sum[303][303], f[303][303][303], maxPre[303][303], maxSuf[303][303];
int val[MAXN], nSize, numFish;

ll sub1(void) {
    ll sum(0);
    for (int i = 0; i < numFish; ++i)
        sum += fish[i].w;

    return sum;
}

ll sub2(void) {
    ll ans(0), sum0(0), sum1(0);
    int j(numFish);
    for (int i = 0; i < numFish; ++i) {
        if(fish[i].x == 0) {
            sum0 += fish[i].w;
        } else {
            if(j == numFish)
                j = i;

            sum1 += fish[i].w;
        }
    }

    ans = max(sum0, sum1);
    if(nSize == 2)
        return ans;

    sum0 = 0;
    for (int i = 0; i < numFish; ++i) {
        if(fish[i].x == 1)
            break;

        sum0 += fish[i].w;
        while(j < numFish && fish[j].y <= fish[i].y) {
            sum1 -= fish[j].w;
            ++j;
        }

        ans = max(ans, sum0 + sum1);
    }

    return ans;
}

ll sub3(void) {
    for (int i = 0; i <= 1; ++i)
        f[i][0][0] = f[i][1][0] = f[i][2][0] = -1e18;

    for (int i = 0; i < numFish; ++i)
        val[fish[i].x] = fish[i].w;

    f[0][2][0] = 0;
    for (int i = 0; i < nSize; ++i) {
        int pre(i & 1), cur(!pre);
        f[cur][0][0] = max(f[pre][0][0], max(f[pre][1][0], f[pre][2][0] + (i > 0 ? val[i - 1] : 0)));
        f[cur][1][0] = f[pre][0][0] + val[i];
        f[cur][2][0] = max(f[pre][2][0], f[pre][1][0]);

        //cout << f[cur][0][0] << ' ' << f[cur][1][0] << ' ' << f[cur][2][0] << '\n';
    }

    return max({f[nSize & 1][0][0], f[nSize & 1][1][0], f[nSize & 1][2][0]});
}

ll sub5(void) {
    for (int i = 0; i < numFish; ++i)
        sum[fish[i].x][fish[i].y + 1] += fish[i].w;

    for (int i = 0; i < nSize; ++i) {
        for (int j = 1; j <= nSize; ++j)
            sum[i][j] += sum[i][j - 1];
    }

    for (int j = 0; j <= nSize; ++j) {
        for (int k = 0; k <= nSize; ++k) {
            f[0][j][k] = -1e18;
        }
    }

    f[0][0][0] = 0;
    for (int j = 0; j <= nSize; ++j) {
        for (int k = 0; k <= nSize; ++k) {
            maxPre[j][k] = f[0][j][k];
            if(k > 0)
                maxPre[j][k] = max(maxPre[j][k], maxPre[j][k - 1]);
        }
    }

    for (int j = nSize; j >= 0; --j) {
        for (int k = nSize; k >= 0; --k) {
            maxSuf[j][k] = f[0][j][k];
            if(k + 1 < nSize)
                maxSuf[j][k] = max(maxSuf[j][k], maxSuf[j][k + 1]);
        }
    }

    for (int i = 0; i < nSize; ++i) {
        for (int coln = 0; coln <= nSize; ++coln) {
            for (int pcol = 0; pcol <= nSize; ++pcol) {
                if(coln <= pcol) {
                    f[i + 1][coln][pcol] = maxSuf[pcol][0] + sum[i][pcol] - sum[i][coln];
                    continue;
                }

                f[i + 1][coln][pcol] = maxPre[pcol][coln] + (i > 0 ? sum[i - 1][coln] : 0);
                f[i + 1][coln][pcol] = max(f[i + 1][coln][pcol], maxSuf[pcol][coln]);
            }
        }

        for (int j = 0; j <= nSize; ++j) {
            for (int k = 0; k <= nSize; ++k) {
                maxPre[j][k] = f[i + 1][j][k] - sum[i][max(j, k)];
                if(k > 0)
                    maxPre[j][k] = max(maxPre[j][k], maxPre[j][k - 1]);
            }
        }

        for (int j = nSize; j >= 0; --j) {
            for (int k = nSize; k >= 0; --k) {
                maxSuf[j][k] = f[i + 1][j][k];
                if(k + 1 < nSize)
                    maxSuf[j][k] = max(maxSuf[j][k], maxSuf[j][k + 1]);
            }
        }
    }

    ll res(0);
    for (int j = 0; j < nSize; ++j)
        res = max(res, maxSuf[j][0]);

    return res;
}

ll max_weights(int _N, int _M, vector<int> _X, vector<int> _Y, vector<int> _W) {
    nSize = _N, numFish = _M;

    bool check1(1), check2(1), check3(1);
    for (int i = 0; i < numFish; ++i) {
        fish[i] = {_X[i], _Y[i], _W[i]};
        check1 &= !(fish[i].x & 1);
        check2 &= (fish[i].x <= 1);
        check3 &= (fish[i].y == 0);
    }

    sort(fish, fish + numFish, [](const Fish &a, const Fish &b) {
        return (a.x != b.x) ? a.x < b.x : a.y < b.y;
    });

    if(check1) {
        return sub1();
    } else
        if(check2) {
            return sub2();
        } else
            if(check3) {
                return sub3();
            } else
                if(nSize <= 300) {
                    return sub5();
                }
}

#ifdef Nhoksocqt1

int main(void) {
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);

    #define TASK "fish"
    if(fopen(TASK".inp", "r")) {
        freopen(TASK".inp", "r", stdin);
        freopen(TASK".out", "w", stdout);
    }

    vector<int> _X, _Y, _W;
    int _N, _M;
    cin >> _N >> _M;

    _X.resize(_N), _Y.resize(_N), _W.resize(_N);
    for (int i = 0; i < _N; ++i)
        cin >> _X[i] >> _Y[i] >> _W[i];

    ll ans = max_weights(_N, _M, _X, _Y, _W);
    cout << "ANSWER: " << ans << '\n';
    cout << "SUB5: " << sub5() << '\n';

    return 0;
}

#endif // Nhoksocqt1

Compilation message

fish.cpp: In function 'll max_weights(int, int, std::vector<int>, std::vector<int>, std::vector<int>)':
fish.cpp:189:1: warning: control reaches end of non-void function [-Wreturn-type]
  189 | }
      | ^
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 6232 KB Output is correct
2 Correct 31 ms 6896 KB Output is correct
3 Correct 1 ms 4444 KB Output is correct
4 Correct 1 ms 4444 KB Output is correct
5 Correct 92 ms 11348 KB Output is correct
6 Correct 103 ms 11564 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB Output is correct
2 Correct 55 ms 8340 KB Output is correct
3 Correct 60 ms 9044 KB Output is correct
4 Correct 24 ms 6232 KB Output is correct
5 Correct 33 ms 6896 KB Output is correct
6 Correct 1 ms 4440 KB Output is correct
7 Correct 1 ms 4444 KB Output is correct
8 Correct 1 ms 4444 KB Output is correct
9 Correct 1 ms 4444 KB Output is correct
10 Correct 1 ms 4440 KB Output is correct
11 Correct 1 ms 4444 KB Output is correct
12 Correct 23 ms 6236 KB Output is correct
13 Correct 29 ms 6748 KB Output is correct
14 Correct 25 ms 6236 KB Output is correct
15 Correct 28 ms 6740 KB Output is correct
16 Correct 24 ms 6236 KB Output is correct
17 Correct 27 ms 6492 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB Output is correct
2 Correct 2 ms 8540 KB Output is correct
3 Correct 16 ms 9848 KB Output is correct
4 Correct 11 ms 9560 KB Output is correct
5 Correct 31 ms 11100 KB Output is correct
6 Correct 26 ms 11100 KB Output is correct
7 Correct 29 ms 11076 KB Output is correct
8 Correct 31 ms 11096 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 12632 KB Output is correct
2 Correct 2 ms 14684 KB Output is correct
3 Correct 1 ms 4444 KB Output is correct
4 Correct 1 ms 4444 KB Output is correct
5 Correct 1 ms 4444 KB Output is correct
6 Correct 1 ms 4444 KB Output is correct
7 Correct 1 ms 4444 KB Output is correct
8 Correct 1 ms 10588 KB Output is correct
9 Correct 58 ms 102716 KB Output is correct
10 Correct 287 ms 223992 KB Output is correct
11 Correct 42 ms 102604 KB Output is correct
12 Correct 278 ms 224088 KB Output is correct
13 Correct 11 ms 63832 KB Output is correct
14 Correct 259 ms 223820 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 12632 KB Output is correct
2 Correct 2 ms 14684 KB Output is correct
3 Correct 1 ms 4444 KB Output is correct
4 Correct 1 ms 4444 KB Output is correct
5 Correct 1 ms 4444 KB Output is correct
6 Correct 1 ms 4444 KB Output is correct
7 Correct 1 ms 4444 KB Output is correct
8 Correct 1 ms 10588 KB Output is correct
9 Correct 58 ms 102716 KB Output is correct
10 Correct 287 ms 223992 KB Output is correct
11 Correct 42 ms 102604 KB Output is correct
12 Correct 278 ms 224088 KB Output is correct
13 Correct 11 ms 63832 KB Output is correct
14 Correct 259 ms 223820 KB Output is correct
15 Correct 259 ms 223824 KB Output is correct
16 Incorrect 11 ms 64072 KB 1st lines differ - on the 1st token, expected: '741526820812', found: '730934828993'
17 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 12632 KB Output is correct
2 Correct 2 ms 14684 KB Output is correct
3 Correct 1 ms 4444 KB Output is correct
4 Correct 1 ms 4444 KB Output is correct
5 Correct 1 ms 4444 KB Output is correct
6 Correct 1 ms 4444 KB Output is correct
7 Correct 1 ms 4444 KB Output is correct
8 Correct 1 ms 10588 KB Output is correct
9 Correct 58 ms 102716 KB Output is correct
10 Correct 287 ms 223992 KB Output is correct
11 Correct 42 ms 102604 KB Output is correct
12 Correct 278 ms 224088 KB Output is correct
13 Correct 11 ms 63832 KB Output is correct
14 Correct 259 ms 223820 KB Output is correct
15 Correct 259 ms 223824 KB Output is correct
16 Incorrect 11 ms 64072 KB 1st lines differ - on the 1st token, expected: '741526820812', found: '730934828993'
17 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB Output is correct
2 Correct 2 ms 8540 KB Output is correct
3 Correct 16 ms 9848 KB Output is correct
4 Correct 11 ms 9560 KB Output is correct
5 Correct 31 ms 11100 KB Output is correct
6 Correct 26 ms 11100 KB Output is correct
7 Correct 29 ms 11076 KB Output is correct
8 Correct 31 ms 11096 KB Output is correct
9 Runtime error 38 ms 17720 KB Execution killed with signal 11
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 6232 KB Output is correct
2 Correct 31 ms 6896 KB Output is correct
3 Correct 1 ms 4444 KB Output is correct
4 Correct 1 ms 4444 KB Output is correct
5 Correct 92 ms 11348 KB Output is correct
6 Correct 103 ms 11564 KB Output is correct
7 Correct 1 ms 4444 KB Output is correct
8 Correct 55 ms 8340 KB Output is correct
9 Correct 60 ms 9044 KB Output is correct
10 Correct 24 ms 6232 KB Output is correct
11 Correct 33 ms 6896 KB Output is correct
12 Correct 1 ms 4440 KB Output is correct
13 Correct 1 ms 4444 KB Output is correct
14 Correct 1 ms 4444 KB Output is correct
15 Correct 1 ms 4444 KB Output is correct
16 Correct 1 ms 4440 KB Output is correct
17 Correct 1 ms 4444 KB Output is correct
18 Correct 23 ms 6236 KB Output is correct
19 Correct 29 ms 6748 KB Output is correct
20 Correct 25 ms 6236 KB Output is correct
21 Correct 28 ms 6740 KB Output is correct
22 Correct 24 ms 6236 KB Output is correct
23 Correct 27 ms 6492 KB Output is correct
24 Correct 1 ms 4444 KB Output is correct
25 Correct 2 ms 8540 KB Output is correct
26 Correct 16 ms 9848 KB Output is correct
27 Correct 11 ms 9560 KB Output is correct
28 Correct 31 ms 11100 KB Output is correct
29 Correct 26 ms 11100 KB Output is correct
30 Correct 29 ms 11076 KB Output is correct
31 Correct 31 ms 11096 KB Output is correct
32 Correct 2 ms 12632 KB Output is correct
33 Correct 2 ms 14684 KB Output is correct
34 Correct 1 ms 4444 KB Output is correct
35 Correct 1 ms 4444 KB Output is correct
36 Correct 1 ms 4444 KB Output is correct
37 Correct 1 ms 4444 KB Output is correct
38 Correct 1 ms 4444 KB Output is correct
39 Correct 1 ms 10588 KB Output is correct
40 Correct 58 ms 102716 KB Output is correct
41 Correct 287 ms 223992 KB Output is correct
42 Correct 42 ms 102604 KB Output is correct
43 Correct 278 ms 224088 KB Output is correct
44 Correct 11 ms 63832 KB Output is correct
45 Correct 259 ms 223820 KB Output is correct
46 Correct 259 ms 223824 KB Output is correct
47 Incorrect 11 ms 64072 KB 1st lines differ - on the 1st token, expected: '741526820812', found: '730934828993'
48 Halted 0 ms 0 KB -