답안 #1074283

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1074283 2024-08-25T09:21:35 Z Gromp15 메기 농장 (IOI22_fish) C++17
61 / 100
1000 ms 51088 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) {
	if (*max_element(all(x)) <= 1) {
		ar<ll, 2> ans{};
		for (int i = 0; i < m; i++) ans[x[i]] += w[i];
		return max(ans[0], ans[1] * (1 + (n > 2)));
	}
	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 16 ms 2136 KB Output is correct
2 Correct 16 ms 2652 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 218 ms 51088 KB Output is correct
6 Correct 215 ms 40276 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Incorrect 32 ms 6932 KB 1st lines differ - on the 1st token, expected: '40604614618209', found: '80958394776886'
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 34 ms 12960 KB Output is correct
3 Correct 63 ms 15464 KB Output is correct
4 Correct 52 ms 15440 KB Output is correct
5 Correct 87 ms 20048 KB Output is correct
6 Correct 79 ms 20136 KB Output is correct
7 Correct 74 ms 20048 KB Output is correct
8 Correct 77 ms 20228 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 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 348 KB Output is correct
10 Correct 2 ms 604 KB Output is correct
11 Correct 1 ms 348 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 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 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 348 KB Output is correct
10 Correct 2 ms 604 KB Output is correct
11 Correct 1 ms 348 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 708 KB Output is correct
17 Correct 217 ms 7836 KB Output is correct
18 Correct 209 ms 7756 KB Output is correct
19 Correct 103 ms 4956 KB Output is correct
20 Correct 102 ms 4992 KB Output is correct
21 Correct 103 ms 4700 KB Output is correct
22 Correct 385 ms 10580 KB Output is correct
23 Correct 20 ms 1468 KB Output is correct
24 Correct 150 ms 4816 KB Output is correct
25 Correct 2 ms 600 KB Output is correct
26 Correct 15 ms 1372 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 1 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 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 348 KB Output is correct
10 Correct 2 ms 604 KB Output is correct
11 Correct 1 ms 348 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 708 KB Output is correct
17 Correct 217 ms 7836 KB Output is correct
18 Correct 209 ms 7756 KB Output is correct
19 Correct 103 ms 4956 KB Output is correct
20 Correct 102 ms 4992 KB Output is correct
21 Correct 103 ms 4700 KB Output is correct
22 Correct 385 ms 10580 KB Output is correct
23 Correct 20 ms 1468 KB Output is correct
24 Correct 150 ms 4816 KB Output is correct
25 Correct 2 ms 600 KB Output is correct
26 Correct 15 ms 1372 KB Output is correct
27 Correct 3 ms 856 KB Output is correct
28 Execution timed out 1068 ms 39444 KB Time limit exceeded
29 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 34 ms 12960 KB Output is correct
3 Correct 63 ms 15464 KB Output is correct
4 Correct 52 ms 15440 KB Output is correct
5 Correct 87 ms 20048 KB Output is correct
6 Correct 79 ms 20136 KB Output is correct
7 Correct 74 ms 20048 KB Output is correct
8 Correct 77 ms 20228 KB Output is correct
9 Correct 87 ms 21840 KB Output is correct
10 Correct 60 ms 12296 KB Output is correct
11 Correct 131 ms 24320 KB Output is correct
12 Correct 0 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 0 ms 344 KB Output is correct
18 Correct 0 ms 348 KB Output is correct
19 Correct 0 ms 344 KB Output is correct
20 Correct 34 ms 12864 KB Output is correct
21 Correct 35 ms 12880 KB Output is correct
22 Correct 104 ms 24148 KB Output is correct
23 Correct 150 ms 35148 KB Output is correct
24 Correct 142 ms 36176 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 2136 KB Output is correct
2 Correct 16 ms 2652 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 218 ms 51088 KB Output is correct
6 Correct 215 ms 40276 KB Output is correct
7 Correct 0 ms 344 KB Output is correct
8 Incorrect 32 ms 6932 KB 1st lines differ - on the 1st token, expected: '40604614618209', found: '80958394776886'
9 Halted 0 ms 0 KB -