답안 #1069239

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1069239 2024-08-21T17:59:13 Z HorizonWest 메기 농장 (IOI22_fish) C++17
29 / 100
1000 ms 133096 KB
#include <iostream>
#include <complex>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <functional>
#include <bitset>
#include <queue>
#include <map>
#include <stack>
#include <cmath>
#include <cstdint>
//#include "fish.h"
using namespace std;
 
#pragma GCC optimize("O3")
#define endl '\n'
#define db double
#define ll long long
#define pb push_back
#define fs first
#define sd second
#define Mod long(1e9 + 7)
#define all(x) x.begin(), x.end()
#define unvisited long(-1)
#define Eps double(1e-9)
#define _for(i, n) for(int i = 0; i < (n); i++)
#define dbg(x) cout << #x ": " << x << endl;
 
const int Max = 1e6 + 7, Inf = 1e9 + 7;
 
void print(bool x) { cout << (x ? "YES" : "NO") << endl; }
 
string tostring (__int128 x)
{
    string ans = "";
    while(x > 0)
    {
        ans += (x % 10 + '0');
        x /= 10;
    }
    reverse(all(ans));
    return ans;
}

vector <vector<pair<ll, ll>>> v;
vector <map<int, int>> mp;
int N;//, mp[3007][3007];

ll C(int i, int j, int k)
{
    if(i >= 0 && i < N)
        return max(0LL, v[i][mp[i][j]].sd - v[i][mp[i][k]].sd);
    else 
        return 0LL;
}

void add(int i, int y, int w)
{
    if(i < 0 || i >= N) 
        return;
    if(mp[i][y] == 0){
        v[i].push_back({ y, 0 });
        mp[i][y] = v[i].size();
    }
    v[i][mp[i][y] - 1].sd += w;
}
 
long long max_weights(int n, int m, vector<int> X, vector<int> Y, vector<int> W) 
{   
    v.clear(); mp.clear();
    v.assign(n + 7, vector <pair<ll, ll>> ());
    mp.assign(n + 1, map<int, int> ()); 
    N = n;
 
    for(int i = 0; i < m; i++){
        //v[X[i]][Y[i]+1].sd = W[i];

        add(X[i], Y[i]+1, W[i]);
        add(X[i] - 2, Y[i]+1, 0);
        add(X[i] - 1, Y[i]+1, 0);
        add(X[i] + 1, Y[i]+1, 0);
        add(X[i] + 2, Y[i]+1, 0);
        //v[X[i]].push_back({ Y[i] + 1, W[i] });
        //if(X[i] > 0) v[X[i]-1].push_back({ Y[i] + 1, 0 });
        //if(X[i] > 1) v[X[i]-2].push_back({ Y[i] + 1, 0 });
        //if(X[i] < n) v[X[i]+1].push_back({ Y[i] + 1, 0 });
        //if(X[i] < n) v[X[i]+2].push_back({ Y[i] + 1, 0 });
    }
 
    for(int i = 0; i < n; i++)
    {
        v[i].push_back({ 0, 0 }); sort(all(v[i]));
 
        for(int j = 0; j < (int) v[i].size(); j++){
            if (j != 0) v[i][j].sd += v[i][j-1].sd;
            mp[i][v[i][j].fs] = j;
        }
    }
 
    vector <vector<ll>> dp1, dp2; ll ans = 0; 
 
    for(int i = 0; i < n; i++)
    {   
        dp1.push_back(vector <ll> (v[i].size(), 0));
        dp2.push_back(vector <ll> (v[i].size(), 0));
 
        for(int j = 0; j < (int) v[i].size(); j++)
        {
            int hj = v[i][j].fs;
 
            dp1[i][j] = C(i-1, hj, 0) + C(i+1, hj, 0);
            dp2[i][j] = C(i-1, hj, 0) + C(i+1, hj, 0);
 
            /*if(i > 1){
                for(int k = 0; k < (int) v[i-2].size(); k++){
                    int hk = v[i-2][k].fs; 
                    dp1[i][j] = max(dp1[i][j], (i > 1 ? dp2[i-2][k] : 0LL) + C(i-1, hj, hk) + C(i+1, hj, 0));
                }
            }*/
 
            /*if(i > 0){
                for(int k = 0; k < (int) v[i-1].size(); k++){    
                    int hk = v[i-1][k].fs; 
                    dp1[i][j] = max(dp1[i][j], (i != 0 ? dp1[i-1][k] : 0) + C(i-1, hj, hk) + C(i+1, hj, 0) - C(i, hk, 0));
                }
            
                for(int k = 0; k < (int) v[i-1].size(); k++){
                    int hk = v[i-1][k].fs; 
                    dp2[i][j] = max(dp2[i][j], (i != 0 ? dp1[i-1][k] : 0) - C(i, hj, 0) + C(i+1, hj, 0));
                    dp2[i][j] = max(dp2[i][j], (i != 0 ? dp2[i-1][k] : 0) - C(i, hj, 0) + C(i+1, hj, 0));
                }
            }*/
 
            ans = max(ans, max(dp1[i][j], dp2[i][j])); 
        } 

        if(i > 1)
        {
            ll k = 0, mx = 0, tmp = 0;

            for(k = 0; k < (int) v[i-2].size(); k++){
                tmp = max(tmp, dp2[i-2][k]); 
            }

            for(int j = 0; j < (int) v[i].size(); j++)
            {
                int hj = v[i][j].fs; 
 
                for(k; k < (int) v[i-2].size(); k++)
                {
                    if(v[i-2][k].fs <= v[i][j].fs)
                    {
                        int hk = v[i-2][k].fs, hx = v[i-2][mx].fs; 

                        ll val1 = dp2[i-2][mx] + C(i-1, hj, hx) + C(i+1, hj, 0);
                        ll val2 = dp2[i-2][k] + C(i-1, hj, hk) + C(i+1, hj, 0);

                        if(val1 < val2){
                            mx = k;
                        }
                    } else break;
                }

                int hx = v[i-2][mx].fs;
                dp1[i][j] = max(dp1[i][j], dp2[i-2][mx] + C(i-1, hj, hx) + C(i+1, hj, 0));
                dp1[i][j] = max(dp1[i][j], tmp + C(i+1, hj, 0)); 

                ans = max(ans, dp1[i][j]); 
            }
        }
 
        if(i > 0)
        {
            ll k = v[i-1].size() - 1, mx = 0; 
            for(int j = (int) v[i].size() - 1; j >= 0; j--)
            {
                int hj = v[i][j].fs;
                for(k; k >= 0; k--){
                    if(v[i-1][k].fs >= v[i][j].fs){
                        mx = max(mx, dp1[i-1][k]); 
                        mx = max(mx, dp2[i-1][k]); 
                    } else break;
                }
 
                dp2[i][j] = max(dp2[i][j], mx - C(i, hj, 0) + C(i+1, hj, 0));
 
                ans = max(ans, max(dp1[i][j], dp2[i][j])); 
            }

            ll tmp = 0;
            for(k = 0; k < (int) v[i-1].size(); k++){
                int hk = v[i-1][k].fs;
                tmp = max(tmp, dp1[i-1][k] - C(i, hk, 0)); 
            }

            k = 0; mx = 0; 
            
            for(int j = 0; j < (int) v[i].size(); j++)
            {
                int hj = v[i][j].fs; 
 
                for(k; k < (int) v[i-1].size(); k++)
                {
                    if(v[i-1][k].fs <= v[i][j].fs)
                    {
                        int hk = v[i-1][k].fs, hx = v[i-1][mx].fs; 

                        ll val1 = dp1[i-1][mx] + C(i-1, hj, hx) + C(i+1, hj, 0) - C(i, hx, 0);
                        ll val2 = dp1[i-1][k] + C(i-1, hj, hk) + C(i+1, hj, 0) - C(i, hk, 0);

                        if(val1 < val2){
                            mx = k;
                        }
                    } else break;
                }

                int hx = v[i-1][mx].fs;
                dp1[i][j] = max(dp1[i][j], dp1[i-1][mx] + C(i-1, hj, hx) + C(i+1, hj, 0) - C(i, hx, 0));
                dp1[i][j] = max(dp1[i][j], tmp + C(i+1, hj, 0)); 
                dp2[i][j] = max(dp2[i][j], dp1[i][j]);

                ans = max(ans, max(dp1[i][j], dp2[i][j])); 
            }
        }
    }
 
    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:150:21: warning: statement has no effect [-Wunused-value]
  150 |                 for(k; k < (int) v[i-2].size(); k++)
      |                     ^
fish.cpp:179:21: warning: statement has no effect [-Wunused-value]
  179 |                 for(k; k >= 0; k--){
      |                     ^
fish.cpp:203:21: warning: statement has no effect [-Wunused-value]
  203 |                 for(k; k < (int) v[i-1].size(); k++)
      |                     ^
# 결과 실행 시간 메모리 Grader output
1 Correct 427 ms 50076 KB Output is correct
2 Correct 569 ms 58368 KB Output is correct
3 Correct 41 ms 26608 KB Output is correct
4 Correct 39 ms 26804 KB Output is correct
5 Execution timed out 1054 ms 133096 KB Time limit exceeded
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 747 ms 61576 KB Output is correct
3 Correct 934 ms 71188 KB Output is correct
4 Correct 434 ms 50840 KB Output is correct
5 Correct 578 ms 58440 KB Output is correct
6 Correct 1 ms 352 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 39 ms 26796 KB Output is correct
11 Correct 36 ms 26036 KB Output is correct
12 Correct 585 ms 56452 KB Output is correct
13 Correct 776 ms 66252 KB Output is correct
14 Correct 509 ms 52860 KB Output is correct
15 Correct 393 ms 47380 KB Output is correct
16 Correct 588 ms 53424 KB Output is correct
17 Correct 688 ms 59432 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 39 ms 26316 KB Output is correct
2 Correct 50 ms 26100 KB Output is correct
3 Correct 68 ms 29672 KB Output is correct
4 Correct 64 ms 30880 KB Output is correct
5 Correct 117 ms 36788 KB Output is correct
6 Correct 106 ms 35636 KB Output is correct
7 Correct 121 ms 36408 KB Output is correct
8 Correct 103 ms 36256 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 600 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 1 ms 548 KB Output is correct
10 Correct 3 ms 600 KB Output is correct
11 Correct 1 ms 604 KB Output is correct
12 Correct 3 ms 724 KB Output is correct
13 Correct 1 ms 348 KB Output is correct
14 Correct 1 ms 604 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 600 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 1 ms 548 KB Output is correct
10 Correct 3 ms 600 KB Output is correct
11 Correct 1 ms 604 KB Output is correct
12 Correct 3 ms 724 KB Output is correct
13 Correct 1 ms 348 KB Output is correct
14 Correct 1 ms 604 KB Output is correct
15 Correct 2 ms 600 KB Output is correct
16 Correct 5 ms 860 KB Output is correct
17 Correct 119 ms 8276 KB Output is correct
18 Correct 100 ms 6672 KB Output is correct
19 Correct 111 ms 8016 KB Output is correct
20 Correct 93 ms 6228 KB Output is correct
21 Correct 84 ms 5864 KB Output is correct
22 Correct 188 ms 11572 KB Output is correct
23 Incorrect 50 ms 4432 KB 1st lines differ - on the 1st token, expected: '3061077668538', found: '3061028647437'
24 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 600 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 1 ms 348 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 1 ms 548 KB Output is correct
10 Correct 3 ms 600 KB Output is correct
11 Correct 1 ms 604 KB Output is correct
12 Correct 3 ms 724 KB Output is correct
13 Correct 1 ms 348 KB Output is correct
14 Correct 1 ms 604 KB Output is correct
15 Correct 2 ms 600 KB Output is correct
16 Correct 5 ms 860 KB Output is correct
17 Correct 119 ms 8276 KB Output is correct
18 Correct 100 ms 6672 KB Output is correct
19 Correct 111 ms 8016 KB Output is correct
20 Correct 93 ms 6228 KB Output is correct
21 Correct 84 ms 5864 KB Output is correct
22 Correct 188 ms 11572 KB Output is correct
23 Incorrect 50 ms 4432 KB 1st lines differ - on the 1st token, expected: '3061077668538', found: '3061028647437'
24 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 39 ms 26316 KB Output is correct
2 Correct 50 ms 26100 KB Output is correct
3 Correct 68 ms 29672 KB Output is correct
4 Correct 64 ms 30880 KB Output is correct
5 Correct 117 ms 36788 KB Output is correct
6 Correct 106 ms 35636 KB Output is correct
7 Correct 121 ms 36408 KB Output is correct
8 Correct 103 ms 36256 KB Output is correct
9 Correct 433 ms 82948 KB Output is correct
10 Correct 88 ms 24384 KB Output is correct
11 Correct 232 ms 48692 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 0 ms 348 KB Output is correct
15 Correct 0 ms 348 KB Output is correct
16 Correct 0 ms 348 KB Output is correct
17 Correct 1 ms 348 KB Output is correct
18 Correct 37 ms 26640 KB Output is correct
19 Correct 37 ms 26044 KB Output is correct
20 Correct 36 ms 26556 KB Output is correct
21 Correct 39 ms 26596 KB Output is correct
22 Incorrect 507 ms 80820 KB 1st lines differ - on the 1st token, expected: '45561826463480', found: '45561435344899'
23 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 427 ms 50076 KB Output is correct
2 Correct 569 ms 58368 KB Output is correct
3 Correct 41 ms 26608 KB Output is correct
4 Correct 39 ms 26804 KB Output is correct
5 Execution timed out 1054 ms 133096 KB Time limit exceeded
6 Halted 0 ms 0 KB -