#include "fish.h"
#include "bits/stdc++.h"
using namespace std;
#define all(x) begin(x),end(x)
template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; }
template<typename T_container, typename T = typename enable_if<!is_same<T_container, string>::value, typename T_container::value_type>::type> ostream& operator<<(ostream &os, const T_container &v) { string sep; for (const T &x : v) os << sep << x, sep = " "; return os; }
#define debug(a) cerr << "(" << #a << ": " << a << ")\n";
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int,int> pi;
const ll oo = 1e18;
void cmax(ll& a, ll b) {a=max(a,b);}
long long max_weights(int N, int M, std::vector<int> X, std::vector<int> Y, std::vector<int> W) {
vvi ys(N+1);
bool allEven=1;
ll total=0;
for(int i=0;i<M;++i) {
if(X[i]%2!=0) allEven=0;
Y[i]++,X[i]++;
total+=W[i];
ys[X[i]].push_back(i);
}
vector<vector<ll>> pref(N+1,{0});
{
int x=0;
for(auto& v : ys) {
sort(all(v),[&](int i, int j) {return Y[i]<Y[j];});
for(auto& id : v) {
pref[x].push_back(W[id]);
id = Y[id];
}
v.insert(v.begin(),0);
partial_sum(all(pref[x]),pref[x].begin());
x++;
}
}
// dynamic programming
// DP[column][y-pos][state]
// state {0: rising, 1: falling}
// transition going up:
array<vector<ll>,2> dp = {vector<ll>{0LL},{-oo}};
ll top = -oo;
auto getS = [&](int x, int y) {
auto i = max(0LL,upper_bound(all(ys[x]),y)-ys[x].begin()-1LL);
return pref[x][i];
};
for(int x=1;x<=N;++x) {
int k = ys[x].size();
array<vector<ll>,2> ndp = {vector<ll>(k,-oo),vector<ll>(k,-oo)};
// falling to falling
{
int j = ys[x-1].size()-1;
ll best = -oo;
for(int i=k-1;i>=0;--i) {
while(j>=0 and ys[x-1][j]>=ys[x][i]) {
cmax(best,dp[1][j]);
--j;
}
cmax(ndp[1][i], best-getS(x-1,ys[x][i]) + pref[x][i]);
}
}
// rising to rising
{
int j = 0;
ll best = -oo;
for(int i=0;i<k;++i) {
while(j<int(ys[x-1].size()) and ys[x-1][j]<=ys[x][i]) {
cmax(best,dp[0][j]-getS(x,ys[x-1][j]));
--j;
}
cmax(ndp[0][i], best + pref[x][i]);
}
}
// falling to rising, case 1
{
ll best = *max_element(all(dp[1]));
for(int i=0;i<k;++i)
cmax(ndp[0][i],best+pref[x][i]);
}
// falling to rising, spaced one apart.
{
int j = 0;
ll best = -oo;
for(int i=0;i<k;++i) {
while(j<int(ys[x-1].size()) and ys[x-1][j]<=ys[x][i]) {
cmax(best,dp[1][j]-pref[x][i]-pref[x-1][j]);
--j;
}
cmax(ndp[0][i], best + pref[x][i] + getS(x-1, ys[x][i]));
}
}
// top to falling
for(int i=0;i<k;++i) {
cmax(ndp[1][i],pref[x][i]+top);
}
// rising to top
cmax(top,*max_element(all(dp[0])));
swap(dp,ndp);
}
// falling or top
return max(top,*max_element(all(dp[1])));
}
Compilation message
fish.cpp: In function 'long long int max_weights(int, int, std::vector<int>, std::vector<int>, std::vector<int>)':
fish.cpp:17:10: warning: variable 'allEven' set but not used [-Wunused-but-set-variable]
17 | bool allEven=1;
| ^~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
49 ms |
14236 KB |
1st lines differ - on the 1st token, expected: '40313272768926', found: '40313272768959' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
212 KB |
1st lines differ - on the 1st token, expected: '2', found: '34' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
19 ms |
11220 KB |
1st lines differ - on the 1st token, expected: '10082010', found: '10082043' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
212 KB |
1st lines differ - on the 1st token, expected: '3', found: '35' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
212 KB |
1st lines differ - on the 1st token, expected: '3', found: '35' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
212 KB |
1st lines differ - on the 1st token, expected: '3', found: '35' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
19 ms |
11220 KB |
1st lines differ - on the 1st token, expected: '10082010', found: '10082043' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
49 ms |
14236 KB |
1st lines differ - on the 1st token, expected: '40313272768926', found: '40313272768959' |
2 |
Halted |
0 ms |
0 KB |
- |