제출 #947128

#제출 시각아이디문제언어결과실행 시간메모리
947128Nhoksocqt1메기 농장 (IOI22_fish)C++17
53 / 100
1046 ms459276 KiB
#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 f[303][303][303], sum[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][nSize] + (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 < 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

컴파일 시 표준 에러 (stderr) 메시지

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 | }
      | ^
#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...