답안 #829407

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
829407 2023-08-18T10:21:49 Z caganyanmaz 메기 농장 (IOI22_fish) C++17
12 / 100
120 ms 34192 KB
#include <bits/stdc++.h>
#define pb push_back
#define int int64_t
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

using namespace std;
#ifdef DEBUGGING
#include "../debug.h"
#else
#define debug(x...) void(42)
#endif 

int n;
int m;
constexpr static int MXN = 1e5 + 5;
constexpr static int INC = 0;
constexpr static int DEC = 1;
constexpr static int ZER = 2;
vector<array<int, 3>> dp[MXN]; // Y position, height (in fish units), state (increasing, decreasing, zeroed (returns previous height)
vector<int> lpf[MXN];
vector<int> rpf[MXN];
vector<array<int, 2>> f[MXN]; // X pos, Y pos, height/weight

int max_weights(int32_t N, int32_t M, vector<int32_t> x, vector<int32_t> y, vector<int32_t> w) 
{
	n = N;
	m = M;
	for (int i = 0; i < m; i++)
		f[x[i]].pb({y[i], w[i]});
	for (int i = 0; i < n; i++)
		sort(f[i].begin(), f[i].end());
	dp[0]= vector<array<int,3>>(f[0].size()+1, array<int, 3>({0, 0, 0}));
	for (int i = 0; i <= f[0].size(); i++)
	{
		dp[0][i][INC] = 0;
		dp[0][i][DEC] = 0;
	}
	for (int i = 1; i < n; i++)
	{
		dp[i]= vector<array<int,3>>(f[i].size()+1, array<int, 3>({0, 0, 0}));
		// Calculate prefixes
		// Calculate INC -> INC
		int k = 0; // Previous level
		for (int j = 0; j <= f[i].size(); j++) // Current level
		{
			if (j > 0)
				dp[i][j][INC] = max(dp[i][j][INC], dp[i][j-1][INC]);
			while (k <= f[i-1].size() && j < f[i].size() && (k == f[i-1].size() || f[i][j][0] > f[i-1][k][0]))
			{
				dp[i][j][INC] = max(dp[i][j][INC], dp[i-1][k][INC]);
				if (k < f[i-1].size())
					dp[i][j][INC] += f[i-1][k][1];
				k++;
			}
		}
		debug(dp[i-1][k][INC]);
		// Calculating DEC -> DEC
		k = f[i-1].size(); // Previous level
		for (int j = f[i].size(); j >= 0; j--)
		{
			
			if (j < f[i].size())
			{
				dp[i][j][DEC] = max(dp[i][j][DEC], dp[i][j+1][DEC]);
				debug(dp[i][j+1][DEC]);
			}
			while (k >= 0 && (k == f[i-1].size() || (j != f[i].size() && f[i-1][k][0] > f[i][j][0])))
			{
				dp[i][j][DEC] = max(dp[i][j][DEC], dp[i-1][k][DEC]);
				debug(dp[i-1][k][DEC]);
				k--;
			}
			if (j < f[i].size())
			{
				dp[i][j][DEC] += f[i][j][1];
				debug(f[i][j][1]);
			}
		}
		debug(1, dp[i]);

		// Calculating INC -> DEC (it's only reasonable at the peak
		// Calculating DEC -> ZER
		k = 0;
		for (int j = 0; j <= f[i].size(); j++)
		{
			while (k < f[i-1].size() && (j == f[i].size() || f[i-1][k][0] < f[i][j][0]))
			{
				dp[i][j][ZER] = max(dp[i][j][ZER], dp[i-1][k][DEC]);
				k++;
			}
		}
		dp[i][f[i].size()][ZER] = max(dp[i][f[i].size()][ZER], dp[i-1][f[i-1].size()][DEC]);
		// Calculating ZER -> INC
		vector<int> best_upper(f[i].size()+1);
		k = f[i-1].size();
		int change = 0;
		for (int j = 0; j < f[i-1].size(); j++)
			change += f[i-1][j][1];
		for (int j = f[i].size(); j>= 0; j--)
		{
			if (j < f[i].size())
				best_upper[j] = max(best_upper[j], best_upper[j+1]);
			while (k > 0 && (k == f[i-1].size() || f[i-1][k][0] > f[i-1][j][0]))
			{
				best_upper[j] = max(best_upper[j], dp[i-1][k][ZER] + change);
				k--;
				if (k >= 0)
					change -= f[i-1][k][1];
			}
		}
		k = 0;
		int sum = 0;
		int prev_val = 0;
		for (int j = 0; j <= f[i].size(); j++)
		{
			dp[i][j][INC] = max(dp[i][j][INC], best_upper[j]);
			while (k < f[i-1].size() && (j == f[i].size() || f[i-1][k][0] < f[i][j][0]))
			{
				prev_val = max(prev_val, dp[i-1][k][ZER]);
				sum += f[i-1][k][1];
				dp[i][j][INC] = max({dp[i][j][INC], prev_val + sum});
				k++;
			}
		}
		// Calcaulating INC to DEC (max only)
		dp[i][f[i].size()][DEC] = max(dp[i][f[i].size()][DEC], dp[i][f[i].size()][INC]);
		debug(i, f[i].size(), dp[i].size(), dp[i]);
	}
	int best = 0;
	for (int i = 0; i < dp[n-1].size(); i++)
	{
		debug(i, dp[n-1][i][DEC], dp[n-1][i][INC], dp[n-1][i][ZER]);
		best = max({best, dp[n-1][i][DEC], dp[n-1][i][INC], dp[n-1][i][ZER]});
	}
	return best;



}

Compilation message

fish.cpp: In function 'int64_t max_weights(int32_t, int32_t, std::vector<int>, std::vector<int>, std::vector<int>)':
fish.cpp:34:20: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   34 |  for (int i = 0; i <= f[0].size(); i++)
      |                  ~~^~~~~~~~~~~~~~
fish.cpp:45:21: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |   for (int j = 0; j <= f[i].size(); j++) // Current level
      |                   ~~^~~~~~~~~~~~~~
fish.cpp:49:13: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   49 |    while (k <= f[i-1].size() && j < f[i].size() && (k == f[i-1].size() || f[i][j][0] > f[i-1][k][0]))
      |           ~~^~~~~~~~~~~~~~~~
fish.cpp:49:35: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   49 |    while (k <= f[i-1].size() && j < f[i].size() && (k == f[i-1].size() || f[i][j][0] > f[i-1][k][0]))
      |                                 ~~^~~~~~~~~~~~~
fish.cpp:49:55: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   49 |    while (k <= f[i-1].size() && j < f[i].size() && (k == f[i-1].size() || f[i][j][0] > f[i-1][k][0]))
      |                                                     ~~^~~~~~~~~~~~~~~~
fish.cpp:52:11: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   52 |     if (k < f[i-1].size())
      |         ~~^~~~~~~~~~~~~~~
fish.cpp:63:10: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |    if (j < f[i].size())
      |        ~~^~~~~~~~~~~~~
fish.cpp:68:24: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |    while (k >= 0 && (k == f[i-1].size() || (j != f[i].size() && f[i-1][k][0] > f[i][j][0])))
      |                      ~~^~~~~~~~~~~~~~~~
fish.cpp:68:47: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |    while (k >= 0 && (k == f[i-1].size() || (j != f[i].size() && f[i-1][k][0] > f[i][j][0])))
      |                                             ~~^~~~~~~~~~~~~~
fish.cpp:74:10: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |    if (j < f[i].size())
      |        ~~^~~~~~~~~~~~~
fish.cpp:85:21: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   85 |   for (int j = 0; j <= f[i].size(); j++)
      |                   ~~^~~~~~~~~~~~~~
fish.cpp:87:13: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   87 |    while (k < f[i-1].size() && (j == f[i].size() || f[i-1][k][0] < f[i][j][0]))
      |           ~~^~~~~~~~~~~~~~~
fish.cpp:87:35: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   87 |    while (k < f[i-1].size() && (j == f[i].size() || f[i-1][k][0] < f[i][j][0]))
      |                                 ~~^~~~~~~~~~~~~~
fish.cpp:98:21: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |   for (int j = 0; j < f[i-1].size(); j++)
      |                   ~~^~~~~~~~~~~~~~~
fish.cpp:102:10: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  102 |    if (j < f[i].size())
      |        ~~^~~~~~~~~~~~~
fish.cpp:104:23: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  104 |    while (k > 0 && (k == f[i-1].size() || f[i-1][k][0] > f[i-1][j][0]))
      |                     ~~^~~~~~~~~~~~~~~~
fish.cpp:115:21: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  115 |   for (int j = 0; j <= f[i].size(); j++)
      |                   ~~^~~~~~~~~~~~~~
fish.cpp:118:13: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  118 |    while (k < f[i-1].size() && (j == f[i].size() || f[i-1][k][0] < f[i][j][0]))
      |           ~~^~~~~~~~~~~~~~~
fish.cpp:118:35: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  118 |    while (k < f[i-1].size() && (j == f[i].size() || f[i-1][k][0] < f[i][j][0]))
      |                                 ~~^~~~~~~~~~~~~~
fish.cpp:131:20: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::array<long int, 3> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  131 |  for (int i = 0; i < dp[n-1].size(); i++)
      |                  ~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 17544 KB Output is correct
2 Correct 45 ms 19048 KB Output is correct
3 Correct 12 ms 12824 KB Output is correct
4 Correct 12 ms 12824 KB Output is correct
5 Correct 112 ms 32172 KB Output is correct
6 Correct 120 ms 34192 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 9684 KB 1st lines differ - on the 1st token, expected: '2', found: '1'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 12756 KB Output is correct
2 Correct 12 ms 12796 KB Output is correct
3 Correct 28 ms 17040 KB Output is correct
4 Correct 23 ms 15924 KB Output is correct
5 Correct 45 ms 21352 KB Output is correct
6 Correct 45 ms 21360 KB Output is correct
7 Correct 55 ms 21356 KB Output is correct
8 Correct 43 ms 21368 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 9684 KB 1st lines differ - on the 1st token, expected: '3', found: '2'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 9684 KB 1st lines differ - on the 1st token, expected: '3', found: '2'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 9684 KB 1st lines differ - on the 1st token, expected: '3', found: '2'
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 12756 KB Output is correct
2 Correct 12 ms 12796 KB Output is correct
3 Correct 28 ms 17040 KB Output is correct
4 Correct 23 ms 15924 KB Output is correct
5 Correct 45 ms 21352 KB Output is correct
6 Correct 45 ms 21360 KB Output is correct
7 Correct 55 ms 21356 KB Output is correct
8 Correct 43 ms 21368 KB Output is correct
9 Incorrect 40 ms 21396 KB 1st lines differ - on the 1st token, expected: '99999', found: '99998'
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 17544 KB Output is correct
2 Correct 45 ms 19048 KB Output is correct
3 Correct 12 ms 12824 KB Output is correct
4 Correct 12 ms 12824 KB Output is correct
5 Correct 112 ms 32172 KB Output is correct
6 Correct 120 ms 34192 KB Output is correct
7 Incorrect 4 ms 9684 KB 1st lines differ - on the 1st token, expected: '2', found: '1'
8 Halted 0 ms 0 KB -