제출 #790159

#제출 시각아이디문제언어결과실행 시간메모리
790159gesgha메기 농장 (IOI22_fish)C++17
15 / 100
1092 ms288472 KiB
#include "fish.h" #include <bits/stdc++.h> #define fr(i, a, b) for (int i = a; i <= b; i++) #define rf(i, a, b) for (int i = a; i >= b; i--) #define fe(x, y) for (auto& x : y) #define fi first #define se second #define pb push_back #define all(x) x.begin(), x.end() #define pw(x) (1LL << (x)) #define sz(x) (int)x.size() using namespace std; #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; #define fbo find_by_order #define ook order_of_key template <typename T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; template <typename T> using ve = vector<T>; template <typename T> bool umx(T& a, T b) { return a < b ? a = b, 1 : 0; } template <typename T> bool umn(T& a, T b) { return a > b ? a = b, 1 : 0; } using ll = long long; using ld = long double; using pll = pair<ll, ll>; using pii = pair<int, int>; const int oo = 1e9; const ll OO = 1e18; const int N = 1e5 + 100; const int M = 3000; const int K = 110; const int mod = 1e9 + 7; const bool TEST = 1; void precalc() {} ve <ll> dp1[N]; // before the i-th is filled, back -- all filled ve <ll> dp2[N]; // before the i-th is filled, back -- all filled ve <ll> zero[N]; // i points is used ve <pii> YY[N]; bool vs[M][M]; gp_hash_table <int, bool> mp[N]; long long max_weights(int N, int M, vector<int> X, vector<int> Y, vector<int> W) { // #ifdef local // freopen("output.txt", "w", stdout); // #endif for (int i = 0; i < M; i++) mp[X[i]][Y[i]] = 1; for (int i = 0; i < M; i++) { if(Y[i] && mp[X[i]][Y[i] - 1] == 0) { mp[X[i]][Y[i] - 1] = 1; X.pb(X[i]); Y.pb(Y[i] - 1); W.pb(0); } if(Y[i] < N - 1 && mp[X[i]][Y[i] + 1] == 0) { mp[X[i]][Y[i] + 1] = 1; X.pb(X[i]); Y.pb(Y[i] + 1); W.pb(0); } if(X[i] > 0) { if (mp[X[i] - 1][Y[i]] == 0) { mp[X[i] - 1][Y[i]] = 1; X.pb(X[i] - 1); Y.pb(Y[i]); W.pb(0); } if (Y[i] && mp[X[i] - 1][Y[i] - 1] == 0) { mp[X[i] - 1][Y[i] - 1] = 1; X.pb(X[i] - 1); Y.pb(Y[i] - 1); W.pb(0); } if (Y[i] < N - 1 && mp[X[i] - 1][Y[i] + 1] == 0) { mp[X[i] - 1][Y[i] + 1] = 1; X.pb(X[i] - 1); Y.pb(Y[i] + 1); W.pb(0); } } if (X[i] < N - 1) { if (mp[X[i] + 1][Y[i]] == 0) { mp[X[i] + 1][Y[i]] = 1; X.pb(X[i] + 1); Y.pb(Y[i]); W.pb(0); } if (Y[i] && mp[X[i] + 1][Y[i] - 1] == 0) { mp[X[i] + 1][Y[i] - 1] = 1; X.pb(X[i] + 1); Y.pb(Y[i] - 1); W.pb(0); } if (Y[i] < N - 1 && mp[X[i] + 1][Y[i] + 1] == 0) { mp[X[i] + 1][Y[i] + 1] = 1; X.pb(X[i] + 1); Y.pb(Y[i] + 1); W.pb(0); } } } for (int i = 0; i < sz(X); i++) { dp1[X[i]].pb(-OO); dp2[X[i]].pb(-OO); zero[X[i]].pb(-OO); YY[X[i]].pb({Y[i], W[i]}); } for (int i = 0; i < N; i++) { sort(all(YY[i])); dp1[i].pb(-OO); dp2[i].pb(-OO); zero[i].pb(-OO); } for (int i = 0; i < sz(dp1[0]); i++) { dp1[0][i] = 0; dp2[0][i] = 0; zero[0][i] = 0; } for (int i = 1; i < N; i++) { // from dp1 { // to zero int Z = 0; ll S = 0; for (int j = 0; j < sz(YY[i - 1]); j++) { while(Z < sz(YY[i]) && YY[i - 1][j].fi - 1 >= YY[i][j].fi) { S += YY[i][Z].se; Z++; } umx(zero[i][Z], dp1[i - 1][j] + S); } for (; Z < sz(YY[i]); Z++) { S += YY[i][Z].se; } umx(zero[i].back(), dp1[i - 1].back() + S); } { // to dp1 umx(dp1[i].back(), dp1[i - 1].back()); ll S = 0; int ptr = sz(YY[i - 1]) - 1; ll mx = dp1[i - 1].back(); for (int j = sz(YY[i]) - 1; j >= 0; j--) { S += YY[i][j].se; while(ptr >= 0 && YY[i - 1][ptr].fi >= YY[i][j].fi) { mx = max(mx, dp1[i - 1][ptr] - S); ptr--; } umx(dp1[i][j], mx + S); } } // from zero for (int j = 0; j <= sz(YY[i - 1]); j++) umx(zero[i][0], zero[i - 1][j]); // to zero { // to dp1 & dp2 { // back ll S = 0; for (int j = sz(YY[i - 1]); j >= 0; j--) { umx(dp1[i].back(), S + zero[i - 1][j]); umx(dp2[i].back(), S + zero[i - 1][j]); if (j - 1 >= 0) S += YY[i - 1][j - 1].se; } } ll res = 0; for (int j = 0; j <= sz(YY[i - 1]); j++) umx(res, zero[i - 1][j]); ll S = 0; ll mx = zero[i - 1][0]; int ptr = 0; for (int j = 0; j < sz(YY[i]); j++) { while (ptr < sz(YY[i - 1]) && YY[i - 1][ptr].fi <= YY[i][j].fi - 1) { S += YY[i - 1][ptr].se; ptr++; umx (mx, zero[i - 1][ptr] - S); } umx(dp1[i][j], max(res, mx + S)); umx(dp2[i][j], max(res, mx + S)); } } // from dp2 { // to zero int Z = 0; ll S = 0; for (int j = 0; j < sz(YY[i - 1]); j++) { while(Z < sz(YY[i]) && YY[i - 1][j].fi - 1 >= YY[i][j].fi) { S += YY[i][Z].se; Z++; } umx(zero[i][Z], dp2[i - 1][j] + S); } for (; Z < sz(YY[i]); Z++) S += YY[i][Z].se; umx(zero[i].back(), dp2[i - 1].back() + S); } { // to dp2 & dp1 ll S = 0; ll mx = 0; int ptr = 0; for (int j = 0; j < sz(YY[i]); j++) { while (ptr < sz(YY[i - 1]) && YY[i - 1][ptr].fi <= YY[i][j].fi - 1) { umx (mx, dp2[i - 1][ptr] - S); S += YY[i - 1][ptr].se; ptr++; } umx(dp2[i][j], mx + S); umx(dp1[i][j], mx + S); } for (; ptr < sz(YY[i - 1]); ptr++) { umx(mx, dp2[i - 1][ptr] - S); S += YY[i - 1][ptr].se; } umx(mx, dp2[i - 1].back() - S); umx(dp2[i].back(), mx + S); umx(dp1[i].back(), mx + S); } } // cout << zero[2][1] << endl; ll ans = 0; fe(x, dp1[N - 1]) { umx(ans, x); } fe(x, dp2[N - 1]) { umx(ans, x); } fe(x, zero[N - 1]) { umx(ans, x); } return ans; }
#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...