Submission #1211451

#TimeUsernameProblemLanguageResultExecution timeMemory
1211451nerrrminCatfish Farm (IOI22_fish)C++20
53 / 100
1101 ms130512 KiB
#include "fish.h"
#include<bits/stdc++.h>
#define pb push_back
#include <vector>
using namespace std;
const int maxn = 3005;
int n, m;
vector < pair < int, int > > g[200000];
long long dp[maxn][maxn][10];
long long best[maxn];
long long pref[maxn][maxn], a[maxn][maxn];
long long get(int col, int l, int r)
{
    if(r < l)return 0;
    if(col > n)return 0;
    long long val = pref[col][r];
    if(l)val -= pref[col][l-1];
    return val;
}
long long p[4][200000];
long long get_p(long long col, long long l, long long r)
{
    if(r < l)return 0;
    if(col > n)return 0;
    long long val = p[col][r];
    if(l)val -= p[col][l-1];
    return val;
}
long long val[200000], d[200000][2][2];
long long max_weights(int N, int M, std::vector<int> X, std::vector<int> Y,
                      std::vector<int> W) {
    n = N;
    m = M;
    long long sum = 0, group1 = 1, group2 = 1, group3 = 1;
    for (int i = 0; i < m; ++ i)
    {
        if(X[i] % 2 == 1)group1 = 0;
        if(X[i] > 1)group2 = 0;
        if(Y[i] > 0)group3 = 0;

        X[i] ++;
        Y[i] ++;
        g[X[i]].pb(make_pair(Y[i], W[i]));
        sum += W[i];
        if(n <= 3000)a[X[i]][Y[i]] = W[i];

        if(X[i] <= 2)p[X[i]][Y[i]] += W[i];
        if(Y[i] == 1)val[X[i]] += W[i];
    }
    if(group1)return sum;
    if(group2)
    {

        long long sum1 = 0, sum2 = 0;
        for (auto &[y, w]: g[1])
            sum1 += w;
        for (auto &[y, w]: g[2])
            sum2 += w;
            long long ans = max(sum1, sum2);
        if(n > 2)
        {
            for (int i = 1; i <= 2; ++ i)
            {
                for (int j = 1; j <= n; ++ j)
                    p[i][j] += p[i][j-1];
            }
            for (int i = 0; i <= n; ++ i)
            {
                long long curr = get_p(1, 1, i) + get_p(2, i+1, n);
                ans = max(ans, curr);
            }
        }
        return ans;
    }
    if(group3)
    {
        d[1][0][0] = 0;
        d[1][0][1] = 0;

        long long ans = 0;
        if(n > 1)ans = val[2];

        for (int i = 2; i <= n; ++ i)
        {
            /// 0
            d[i][0][0] = max(d[i-1][0][0], d[i-1][1][0]);
            d[i][1][0] = max(d[i-1][0][1], d[i-1][1][1]) + val[i];

            /// 1
            d[i][0][1] = max(d[i-1][0][0] + val[i-1], d[i-1][1][0]);
            d[i][1][1] = max(d[i-1][0][1], d[i-1][1][1]);
            ans = max(ans, max(d[i][0][1], d[i][1][1]) + val[i+1]);
        }
        return ans;
    }

    for (int i = 0; i <= n; ++ i)
    {
        pref[i][0] = a[i][0];
        for (int j = 1; j <= n; ++ j)
            pref[i][j] = pref[i][j-1] + a[i][j];
    }
    long long ans = 0;
    for (int j = 0; j <= n; ++ j)
    {
        if(n >= 2)
        {
            ans = max(ans, get(2, 1, j));
            best[1] = ans;
        }
    }

    for (int i = 2; i <= n; ++ i)
    {
        dp[i][0][0] = best[i-1];
        dp[i][0][1] = best[i-1];
        for (int j = 1; j <= n; ++ j)
        {
         //   cout << "solving " << i << " " << j << endl;
            for (int pre = 1; pre <= j; ++ pre)
            {
                dp[i][j][0] = max(dp[i][j][0], dp[i-1][pre][0] + get(i-1, pre + 1, j));
            }
            for (int pre = j; pre <= n; ++ pre)
            {
                dp[i][j][1] = max(dp[i][j][1], dp[i-1][pre][1] + get(i, j+1, pre));
            }
        //    cout << "after basic cases" << dp[i][j][0] << " " << dp[i][j][1] << endl;
            /// start new
            for (int pre = 1; pre <= n; ++ pre)
            {
                if(i > 2)
                {
                    long long curr = max(dp[i-2][pre][0], dp[i-2][pre][1]) + get(i-1, 1, max(pre, j));
                dp[i][j][0] = max(dp[i][j][0], curr);
                dp[i][j][1] = max(dp[i][j][1], curr);
                }
                //if(curr == 801326851508)return 0/0;
            }


                long long curr = get(i-1, 1, j);
                if(i >= 3)curr += best[i-3];
                dp[i][j][0] = max(dp[i][j][0], curr);
                dp[i][j][1] = max(dp[i][j][1], curr);
                if(curr == 801326851508)return 0/0;
           // cout << "after " << dp[i][j][0] << " " << dp[i][j][1] << endl;
            ans = max(ans, max(dp[i][j][0], dp[i][j][1]) + get(i+1, 1, j));
        }
        best[i] = ans;
    }
  return ans;
}

Compilation message (stderr)

fish.cpp: In function 'long long int max_weights(int, int, std::vector<int>, std::vector<int>, std::vector<int>)':
fish.cpp:146:49: warning: division by zero [-Wdiv-by-zero]
  146 |                 if(curr == 801326851508)return 0/0;
      |                                                ~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...