제출 #626261

#제출 시각아이디문제언어결과실행 시간메모리
626261Eae02메기 농장 (IOI22_fish)C++17
84 / 100
1065 ms94400 KiB
#include "fish.h" #include <bits/stdc++.h> using ll = long long; using namespace std; #define all(x) begin(x),end(x) struct SegTree { using T = ll; // use pair of value and index to get index from queries T f(T a, T b) { return max(a, b); } static constexpr T UNIT = 0; // neutral value for f vector<T> s; ll n; SegTree(ll len) : s(2 * len, UNIT), n(len) {} void set(ll pos, T val) { for (s[pos += n] = val; pos /= 2;) s[pos] = f(s[pos * 2], s[pos * 2 + 1]); } T query(ll lo, ll hi) { // query lo to hi (hi not included) if (lo >= hi) return UNIT; T ra = UNIT, rb = UNIT; for (lo += n, hi += n; lo < hi; lo /= 2, hi /= 2) { if (lo % 2) ra = f(ra, s[lo++]); if (hi % 2) rb = f(s[--hi], rb); } return f(ra, rb); } }; vector<vector<pair<ll, ll>>> fishWeightSum; ll weightSum(ll x, ll y) { if (x < 0 || x >= (ll)fishWeightSum.size()) return 0; ll idx = lower_bound(all(fishWeightSum[x]), make_pair(y, (ll)-1)) - fishWeightSum[x].begin(); if (fishWeightSum[x][idx].first > y) idx--; return fishWeightSum[x][idx].second; } long long max_weights(int N, int M, std::vector<int> X, std::vector<int> Y, std::vector<int> W) { if (M == 0) return 0; vector<pair<ll, ll>> piers; vector<tuple<ll, ll, ll>> fish; for (ll i = 0; i < M; i++) { fish.emplace_back(X[i], Y[i], W[i]); if (X[i] != 0) piers.emplace_back(X[i] - 1, Y[i]); if (X[i] != N - 1) piers.emplace_back(X[i] + 1, Y[i]); } sort(all(piers)); piers.erase(unique(all(piers)), piers.end()); sort(all(fish)); fishWeightSum.resize(N); for (ll i = 0; i < N; i++) { fishWeightSum[i].emplace_back(-1, 0); } for (auto [x, y, w] : fish) { fishWeightSum[x].emplace_back(y, fishWeightSum[x].back().second + w); } for (ll i = 0; i < N; i++) { fishWeightSum[i].emplace_back(N + 10, fishWeightSum[i].back().second); } SegTree st1(piers.size()); SegTree st2(piers.size()); SegTree st3(piers.size()); SegTree st4(piers.size()); SegTree st5(piers.size()); vector<array<ll, 2>> dpv(piers.size() + 1); array<ll, 2>* dp = &dpv[1]; for (ll lp = (ll)piers.size() - 1; lp >= -1; lp--) { ll cx = lp == -1 ? -5 : piers[lp].first; ll cy = lp == -1 ? -5 : piers[lp].second; ll x1ShorterFirstIdx = lower_bound(all(piers), make_pair(cx + 1, (ll)-1)) - piers.begin(); ll x1LongerFirstIdx = lower_bound(all(piers), make_pair(cx + 1, cy)) - piers.begin(); ll x2ShorterFirstIdx = lower_bound(all(piers), make_pair(cx + 2, (ll)-1)) - piers.begin(); ll x2LongerFirstIdx = lower_bound(all(piers), make_pair(cx + 2, cy)) - piers.begin(); ll c3FirstIdx = lower_bound(all(piers), make_pair(cx + 3, (ll)-1)) - piers.begin(); for (ll allowNext = 0; allowNext < 2; allowNext++) { ll ans = 0; ans = max(ans, st1.query(x1ShorterFirstIdx, x1LongerFirstIdx)); if (allowNext) { //for (ll np = x1ShorterFirstIdx; np < x1LongerFirstIdx; np++) { // auto [nx, ny] = piers[np]; // ans = max(ans, dp[np][0] + weightSum(nx + 1, ny) - weightSum(nx, ny)); //} ans = max(ans, max(st2.query(x1LongerFirstIdx, x2ShorterFirstIdx), 0LL) - weightSum(cx, cy) - weightSum(cx + 1, cy)); //for (ll np = x1LongerFirstIdx; np < x2ShorterFirstIdx; np++) { // auto [nx, ny] = piers[np]; // ans = max(ans, dp[np][1] + weightSum(nx + 1, ny) + weightSum(nx - 1, ny) - weightSum(cx, cy) - weightSum(cx + 1, cy)); //} } ans = max(ans, st3.query(x2ShorterFirstIdx, x2LongerFirstIdx)); //for (ll np = x2ShorterFirstIdx; np < x2LongerFirstIdx; np++) { // auto [nx, ny] = piers[np]; // ans = max(ans, dp[np][1] + weightSum(nx + 1, ny)); //} ans = max(ans, max(st4.query(x2LongerFirstIdx, c3FirstIdx), 0LL) - weightSum(cx + 1, cy)); //for (ll np = x2LongerFirstIdx; np < c3FirstIdx; np++) { // auto [nx, ny] = piers[np]; // ans = max(ans, dp[np][1] + weightSum(nx + 1, ny) + weightSum(nx - 1, ny) - weightSum(cx + 1, cy)); //} ans = max(ans, st5.query(c3FirstIdx, (ll)piers.size())); //for (ll np = c3FirstIdx; np < (ll)piers.size(); np++) { // auto [nx, ny] = piers[np]; // ans = max(ans, dp[np][1] + weightSum(nx + 1, ny) + weightSum(nx - 1, ny)); //} dp[lp][allowNext] = ans; } if (lp != -1) { st1.set(lp, dp[lp][0] + weightSum(cx + 1, cy) - weightSum(cx, cy)); st2.set(lp, dp[lp][1] + weightSum(cx + 1, cy) + weightSum(cx - 1, cy)); st3.set(lp, dp[lp][1] + weightSum(cx + 1, cy)); st4.set(lp, dp[lp][1] + weightSum(cx + 1, cy) + weightSum(cx - 1, cy)); st5.set(lp, dp[lp][1] + weightSum(cx + 1, cy) + weightSum(cx - 1, cy)); } } return dp[-1][1]; }
#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...