이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "fish.h"
#include <bits/stdc++.h>
using std::vector;
using std::string;
using std::cin;
using std::cout;
using ll = long long;
using vi = vector<ll>;
using vii = vector<vi>;
using pii = std::pair<ll,ll>;
#define ln "\n"
#define rep(i,j,k) for(ll i=ll(j); i<ll(k); i++)
#define REP(i,j,k) for(ll i=ll(j); i<=ll(k); i++)
#define per(i,j,k) for(ll i=ll(j); i>=ll(k); i--)
#define all(a) a.begin(), a.end()
#define mp std::make_pair
#define pb emplace_back
constexpr ll inf = (1ll<<60);
long long max_weights(int N, int M, std::vector<int> X, std::vector<int> Y, std::vector<int> W) {
// task 6
if(N > 3000) return N;
rep(i,0,M) X[i]++, Y[i]++;
// data1 : その行
// data2 : 隣接
vector<vector<pii>> data1(N+2), data2(N+2);
rep(i,0,M){
data1[X[i]].pb(mp(Y[i],W[i]));
if(X[i]-1) data2[X[i]-1].pb(mp(Y[i],W[i]));
if(X[i]+1 <= N) data2[X[i]+1].pb(mp(Y[i],W[i]));
}
vii sum(N+2);
rep(i,0,N+2){
data1[i].pb(mp(0,0));
data2[i].pb(mp(0,0));
sort(all(data1[i]));
sort(all(data2[i]));
sum[i].resize(data1[i].size());
rep(j,1,data1[i].size()) sum[i][j] = sum[i][j-1]+data1[i][j].second;
}
auto id = [&](ll x, ll height){
ll idx = std::upper_bound(all(data1[x]), mp(height, inf))-data1[x].begin();
idx--;
return idx;
};
auto calc = [&](ll x, ll height){
ll idx = std::upper_bound(all(data1[x]), mp(height, inf))-data1[x].begin();
idx--;
return sum[x][idx];
};
vii up(N+2), down(N+2);
up[0].resize(1);
down[0].resize(1);
up[0][0] = down[0][0] = 0;
rep(i,1,N+2){
up[i].resize(data2[i].size(),-inf);
down[i].resize(data2[i].size(),-inf);
rep(j,0,data2[i].size()){
rep(k,0,data2[i-1].size()){
if(data2[i-1][k] <= data2[i][j]){
up[i][j] = std::max(up[i][j], up[i-1][k]+calc(i-1, data2[i][j].first)-calc(i-1, data2[i-1][k].first));
}
if(data2[i-1][k] >= data2[i][j]){
down[i][j] = std::max(down[i][j], down[i-1][k]+calc(i, data2[i-1][k].first)-calc(i, data2[i][j].first));
}
}
}
if(i-2 >= 0){
rep(j,0,data2[i].size()){
rep(k,0,data2[i-2].size()){
up[i][j] = std::max(up[i][j], down[i-2][k]+calc(i-1, std::max(data2[i-2][k].first, data2[i][j].first)));
}
}
}
if(i-3 >= 0){
rep(j,0,data2[i].size()){
rep(k,0,data2[i-3].size()){
up[i][j] = std::max(up[i][j], down[i-3][k]+calc(i-2, data2[i-3][k].first)+calc(i-1,data2[i][j].first));
}
}
}
rep(j,0,data2[i].size()) down[i][j] = std::max(down[i][j], up[i][j]);
}
ll ans = std::max(up[N+1][0], down[N+1][0]);
return ans;
}
컴파일 시 표준 에러 (stderr) 메시지
fish.cpp: In function 'long long int max_weights(int, int, std::vector<int>, std::vector<int>, std::vector<int>)':
fish.cpp:43:8: warning: variable 'id' set but not used [-Wunused-but-set-variable]
43 | auto id = [&](ll x, ll height){
| ^~
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |