제출 #646210

#제출 시각아이디문제언어결과실행 시간메모리
646210ymmCloud Computing (CEOI18_clo)C++17
100 / 100
1461 ms3720 KiB
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (l); --x)
typedef long long ll;
typedef std::pair<int, int> pii;
typedef std::pair<ll , ll > pll;
using namespace std;

#pragma GCC optimize("O3")

struct core {
	int f, v;
};
struct comp {
	int c, f, v;
};
bool cmp_comp(const comp &a, const comp &b)
{
	return a.f < b.f;
}

const int N = 2010;
const int C = 52;
comp custs[N], comps[N];
ll dp[2][N][C*2];
int n, m;

void read_input()
{
	cin >> n;
	Loop (i,0,n) {
		auto &[c, f, v] = comps[i];
		cin >> c >> f >> v;
	}
	cin >> m;
	Loop (i,0,m) {
		auto &[c, f, v] = custs[i];
		cin >> c >> f >> v;
	}
	sort(comps, comps+n, cmp_comp);
	sort(custs, custs+m, cmp_comp);
}

template<class T>
void Smax(T &x, const T &y)
{
	x = max(x, y);
}

void update_dp(int cus, int com, int used)
{
	--cus; --com;
	const int cus2 = cus&1;
	Smax(dp[!cus2][com+1][used], dp[!cus2][com][min(C, used)]);
	if (used >= C)
		Smax(dp[!cus2][com+1][used], dp[cus2][com+1][used]);
	if (comps[com].f < custs[cus].f)
		return;
	int remc_com = comps[com].c - max(0, used-C);
	int remc_cus = custs[cus].c - max(0, C-used);
	ll profit =   (used >= C? custs[cus].v: 0) 
	            - (used <= C? comps[com].v: 0);
	if        (remc_com > remc_cus) {
		int new_used = C + (comps[com].c - (remc_com - remc_cus));
		Smax(dp[!cus2][com+1][    used],
		     dp[ cus2][com+1][new_used] + profit);
	} else if (remc_com < remc_cus) {
		int new_used = C - (custs[cus].c - (remc_cus - remc_com));
		Smax(dp[!cus2][com+1][    used],
		     dp[!cus2][com  ][new_used] + profit);
	} else {
		Smax(dp[!cus2][com+1][used],
		     dp[ cus2][com  ][   C] + profit);
	}
}

int main()
{
	cin.tie(0) -> sync_with_stdio(false);
	read_input();
	memset(dp[0], -32 /* -inf */, sizeof(dp[0]));
	dp[0][0][C] = 0;
	Loop (com,0,n) Loop (used,0,comps[com].c)
		dp[0][com+1][used + C] = 0;
	Loop (cus,0,m) {
		const int cus2 = cus&1;
		memset(dp[!cus2], -32 /* -inf */, sizeof(dp[!cus2]));
		dp[!cus2][0][C] = 0;
		Loop (com,0,n) Loop(used, -custs[cus].c + 1, comps[com].c) {
			update_dp(cus+1, com+1, C + used);
		}
	}
	cout << dp[m&1][n][C] << '\n';
}
#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...