답안 #1074175

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1074175 2024-08-25T08:35:37 Z Gromp15 메기 농장 (IOI22_fish) C++17
61 / 100
1000 ms 2097152 KB
#include <bits/stdc++.h>
#include "fish.h"
#define ll long long
#define ar array
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
using namespace std;
 
const ll INF = 1e18;
template<typename T> bool ckmin(T &a, const T &b ) { return a > b ? a = b, 1 : 0; }
template<typename T> bool ckmax(T &a, const T &b ) { return a < b ? a = b, 1 : 0; }
 
struct seg {
	int N; vector<ll> tree;
	seg(int n) : N(1<<(__lg(n)+1)), tree(2*N, -1e18) {}
	void update(int pos, ll x) {
		for (int i = pos + N; i; i >>= 1) ckmax(tree[i], x);
	}
	ll query(int node, int nl, int nr, int ql, int qr) {
		if (ql > nr || qr < nl) return -1e18;
		if (ql <= nl && nr <= qr) return tree[node];
		int mid = (nl+nr)/2;
		return max(query(node*2, nl, mid, ql, qr), query(node*2+1, mid+1, nr, ql, qr));
	}
	ll query(int l, int r) {
		return query(1, 0, N-1, l, r);
	}
};

long long max_weights(int n, int m, std::vector<int> x, std::vector<int> y, std::vector<int> w) {
	vector<vector<ar<ll, 2>>> each(n);
	for (int i = 0; i < m; i++) {
		each[x[i]].push_back({y[i], w[i]});
		each[x[i]].push_back({y[i]-1, 0});
	}
	for (int i = 0; i < n; i++) each[i].push_back({n-1, 0}), each[i].push_back({-1, 0});
	for (int i = 0; i < n; i++) {
		sort(all(each[i]));
		vector<ar<ll, 2>> nw;
		ll s = 0;
		for (int j = 0; j < sz(each[i]); j++) {
			int r = j;
			while (r+1 < sz(each[i]) && each[i][r+1][0] == each[i][r][0]) r++;
			for (int k = j; k <= r; k++) s += each[i][k][1];
			nw.push_back({each[i][j][0], s});
			j = r;
		}
		assert(is_sorted(all(nw)));
		swap(each[i], nw);
	}
	vector<vector<ll>> dp;
	auto query = [&](int pos, int x) {
		return prev(upper_bound(all(each[pos]), ar<ll, 2>{x, LLONG_MAX})) - each[pos].begin();
	};
	vector<vector<ar<int, 3>>> val(n);
	for (int i = 0; i < n; i++) {
		val[i].resize(sz(each[i]));
		for (int k = 0; k < sz(each[i]); k++) {
			for (int j = -1; j <= 1; j++) {
				if (i + j >= 0 && i + j < n) {
					val[i][k][j+1] = query(i + j, each[i][k][0]);
				}
			}
		}
	}
	vector<vector<ll>> dp3, dp4, dp5;
	for (int i = 0; i < n; i++) {
		vector<vector<ll>> dp2;
		const int N = sz(each[i]);
		dp2.resize(i ? sz(each[i-1]) : 1, vector<ll>(N, -INF));
		if (!i) {
			for (int j = 0; j < N; j++) {
				dp2[0][j] = 0;
			}
			swap(dp, dp2);
		}
		else {
			dp3 = dp, dp4 = dp;
			for (int i = 1; i < sz(dp3); i++) for (int j = 0; j < sz(dp[i]); j++) ckmax(dp3[i][j], dp3[i-1][j]);
			if (i-2 >= 0) {
				for (int j = 0; j < sz(dp4); j++) for (int k = 0; k < sz(dp4[j]); k++) { 
					int R = val[i-2][j][2];
					dp4[j][k] = dp[j][k] + (k <= R ? each[i-1][R][1] - each[i-1][k][1] : 0);
				}
				for (int j = sz(dp4) - 2; j >= 0; j--) for (int k = 0; k < sz(dp4[j]); k++) {
					ckmax(dp4[j][k], dp4[j+1][k]);
				}
			}
			for (int k = 0; k < sz(dp[0]); k++) {
				for (int l = 0; l < N; l++) {
					int ans = 0;
					{
						int l2 = 0, r = i-2 >= 0 ? sz(each[i-2]) - 1 : -1;
						while (l2 <= r) {
							int mid = (l2+r)/2;
							if (val[i-2][mid][2] <= val[i][l][0]) ans = mid, l2 = mid+1;
							else r = mid-1;
						}
					}
					{
						int L = k, R = val[i][l][0];
						ll cost = L <= R ? each[i-1][R][1] - each[i-1][L][1] : 0;
						ckmax(dp2[k][l], dp3[ans][k] + cost);
					}
					if (ans + 1 < sz(dp)) ckmax(dp2[k][l], dp4[ans+1][k]);
				}
			}
			swap(dp, dp2);
		}
	}
	ll ans = -INF;
	for (int i = 0; i < sz(dp); i++) {
		for (int j = 0; j < sz(dp[i]); j++) {
			int L = j, R = val[n-2][i][2];
			ckmax(ans, dp[i][j] + (L <= R ? each[n-1][R][1] - each[n-1][L][1] : 0));
		}
	}
	return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 84 ms 32612 KB Output is correct
2 Correct 98 ms 36996 KB Output is correct
3 Correct 34 ms 12884 KB Output is correct
4 Correct 34 ms 12884 KB Output is correct
5 Correct 230 ms 57496 KB Output is correct
6 Correct 262 ms 46932 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Runtime error 885 ms 2097152 KB Execution killed with signal 9
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 42 ms 12892 KB Output is correct
2 Correct 38 ms 12964 KB Output is correct
3 Correct 67 ms 16492 KB Output is correct
4 Correct 60 ms 16196 KB Output is correct
5 Correct 90 ms 21692 KB Output is correct
6 Correct 80 ms 21160 KB Output is correct
7 Correct 90 ms 21720 KB Output is correct
8 Correct 81 ms 21840 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 344 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 344 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 2 ms 604 KB Output is correct
11 Correct 1 ms 344 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 1 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 344 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 344 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 2 ms 604 KB Output is correct
11 Correct 1 ms 344 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 1 ms 348 KB Output is correct
15 Correct 1 ms 348 KB Output is correct
16 Correct 3 ms 860 KB Output is correct
17 Correct 224 ms 7912 KB Output is correct
18 Correct 256 ms 7768 KB Output is correct
19 Correct 104 ms 4956 KB Output is correct
20 Correct 136 ms 4988 KB Output is correct
21 Correct 111 ms 4696 KB Output is correct
22 Correct 407 ms 10588 KB Output is correct
23 Correct 19 ms 1672 KB Output is correct
24 Correct 132 ms 4808 KB Output is correct
25 Correct 2 ms 604 KB Output is correct
26 Correct 15 ms 1444 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 344 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 344 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 0 ms 348 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 2 ms 604 KB Output is correct
11 Correct 1 ms 344 KB Output is correct
12 Correct 1 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 1 ms 348 KB Output is correct
15 Correct 1 ms 348 KB Output is correct
16 Correct 3 ms 860 KB Output is correct
17 Correct 224 ms 7912 KB Output is correct
18 Correct 256 ms 7768 KB Output is correct
19 Correct 104 ms 4956 KB Output is correct
20 Correct 136 ms 4988 KB Output is correct
21 Correct 111 ms 4696 KB Output is correct
22 Correct 407 ms 10588 KB Output is correct
23 Correct 19 ms 1672 KB Output is correct
24 Correct 132 ms 4808 KB Output is correct
25 Correct 2 ms 604 KB Output is correct
26 Correct 15 ms 1444 KB Output is correct
27 Correct 3 ms 1116 KB Output is correct
28 Execution timed out 1084 ms 39248 KB Time limit exceeded
29 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 42 ms 12892 KB Output is correct
2 Correct 38 ms 12964 KB Output is correct
3 Correct 67 ms 16492 KB Output is correct
4 Correct 60 ms 16196 KB Output is correct
5 Correct 90 ms 21692 KB Output is correct
6 Correct 80 ms 21160 KB Output is correct
7 Correct 90 ms 21720 KB Output is correct
8 Correct 81 ms 21840 KB Output is correct
9 Correct 93 ms 23104 KB Output is correct
10 Correct 65 ms 14084 KB Output is correct
11 Correct 137 ms 27644 KB Output is correct
12 Correct 0 ms 600 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 0 ms 344 KB Output is correct
15 Correct 0 ms 436 KB Output is correct
16 Correct 0 ms 348 KB Output is correct
17 Correct 0 ms 436 KB Output is correct
18 Correct 36 ms 12796 KB Output is correct
19 Correct 33 ms 12848 KB Output is correct
20 Correct 39 ms 12892 KB Output is correct
21 Correct 35 ms 12932 KB Output is correct
22 Correct 113 ms 24000 KB Output is correct
23 Correct 150 ms 35148 KB Output is correct
24 Correct 194 ms 36328 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 84 ms 32612 KB Output is correct
2 Correct 98 ms 36996 KB Output is correct
3 Correct 34 ms 12884 KB Output is correct
4 Correct 34 ms 12884 KB Output is correct
5 Correct 230 ms 57496 KB Output is correct
6 Correct 262 ms 46932 KB Output is correct
7 Correct 0 ms 348 KB Output is correct
8 Runtime error 885 ms 2097152 KB Execution killed with signal 9
9 Halted 0 ms 0 KB -