이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define MASK(i) (1LL << (i))
#define GETBIT(mask, i) (((mask) >> (i)) & 1)
#define ALL(v) (v).begin(), (v).end()
ll max(ll a, ll b){return (a > b) ? a : b;}
ll min(ll a, ll b){return (a < b) ? a : b;}
ll LASTBIT(ll mask){return (mask) & (-mask);}
int pop_cnt(ll mask){return __builtin_popcountll(mask);}
int ctz(ll mask){return __builtin_ctzll(mask);}
int logOf(ll mask){return __lg(mask);}
mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count());
ll rngesus(ll l, ll r){return l + (ull) rng() % (r - l + 1);}
template <class T1, class T2>
bool maximize(T1 &a, T2 b){
if (a < b) {a = b; return true;}
return false;
}
template <class T1, class T2>
bool minimize(T1 &a, T2 b){
if (a > b) {a = b; return true;}
return false;
}
template <class T>
void printArr(T& container, char separator = ' ', char finish = '\n'){
for(auto item: container) cout << item << separator;
cout << finish;
}
#pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
template <class T>
void remove_dup(vector<T> &a){
sort(ALL(a));
a.resize(unique(ALL(a)) - a.begin());
}
struct Stuff{
long c, f, v;
Stuff(long _c, long _f, long _v) {c= _c, f = _f, v = _v;}
bool operator < (Stuff x) const{
return f < x.f;
}
};
const long N = 2009;
const ll INF = 1e18;
ll dp[N][51];
ll sweep[51], tmp[51];
int main(void){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
long n; cin >> n;
vector<Stuff> computers;
for(long i = 0; i<n; ++i){
long c, f, v; cin >> c >> f >> v;
computers.push_back(Stuff(c, f, v));
}
long m; cin >> m;
vector<Stuff> orders;
for(long i= 0; i<m; ++i){
long c, f, v; cin >> c >> f >> v;
orders.push_back(Stuff(c, f, v));
}
sort(ALL(computers)); sort(ALL(orders));
for(long i = 0; i<=n; ++i)
for(long j = 1; j<=50; ++j) dp[i][j] = -INF;
long start = 0;
for(Stuff item: orders){
while(start < n && computers[start].f < item.f) start++;
for(long i = 1; i < n; ++i)
for(long j = 0; j<=50; ++j) maximize(dp[i][0], dp[i-1][j]);
for(long i = 1; i<=item.c; ++i) sweep[i] = -INF;
sweep[0] = 0;
for(long i = start; i < n; ++i){
for(long j= 0; j<=item.c; ++j) tmp[j] = sweep[j];
for(long j = item.c - computers[i].c; j>=0; --j){
maximize(sweep[j + computers[i].c], sweep[j] - computers[i].v);
}
for(long j = 0; j<computers[i].c; ++j){
long t = computers[i].c - j;
ll cost = dp[i][j];
if (j == 0) cost -= computers[i].v;
if (t <= item.c) maximize(sweep[t], cost);
}
for(long j = computers[i].c - item.c; j >= 0; --j){
ll cost = dp[i][j] + item.v;
if (j == 0) cost -= computers[i].v;
maximize(dp[i][j + item.c], cost);
}
for(long j = 0; j<=computers[i].c; ++j){
long t = item.c - j;
if (t < 0) break;
if (tmp[t] == -INF) continue;
ll cost = tmp[t];
if (j > 0) cost -= computers[i].v;
maximize(dp[i][j], cost + item.v);
}
// for(long j = 0; j<=computers[i].c; ++j) cout << dp[i][j] << " ";
// cout << "\n";
}
}
ll ans = -INF;
for(long i = 0; i<=n; ++i)
for(long j = 0; j<=50; ++j) maximize(ans, dp[i][j]);
cout << ans << "\n";
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |