#include "fish.h"
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
#define inc inc1337
#define dec dec1337
#define int long long
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define fi first
#define se second
const int maxn = 1e5;
int n, m;
vector<pii > fish[1 + maxn];
vector<int> reach[1 + maxn];
int len[1 + maxn];
vector<int> inc[1 + maxn];
vector<int> dec[1 + maxn];
int sm[1 + maxn];
int bi[1 + maxn];
int other;
int solve() {
for(int i = 0; i <= n; i++) {
if(fish[i].size() == 1) {
fish[i].pb(mp(n + 1, 0));
}
len[i] = fish[i].size() - 1;
dec[i].resize(1 + len[i]);
inc[i].resize(1 + len[i]);
for(const pii &p : fish[i]) {
if(p.fi != 0) {
reach[i].pb(p.fi - 1);
}
}
reach[i].pb(n + 1);
}
// for(int i = 0; i <= n; i++) {
// cout << i << ":\n";
// for(pii p : fish[i]) {
// cout << p.fi << " " << p.se << "\n";
// }
// for(int x : reach[i]) {
// cout << x << " ";
// }
// cout << "\n";
// cout << len[i] << "\n";
// for(int x : inc[i]) {
// cout << x << " ";
// }
// cout << "\n";
// for(int x : dec[i]) {
// cout << x << " ";
// }
// cout << "\n";
// cout << sm[i] << " " << bi[i] << "\n";
// // other
// }
for(int i = 1; i <= n; i++) {
// inc
{
vector<int> v(1 + len[i - 1]);
v[0] = inc[i - 1][0];
int pref = 0;
for(int j = 1; j <= len[i - 1]; j++) {
pref += fish[i - 1][j].se;
v[j] = inc[i - 1][j] - pref;
v[j] = max(v[j], v[j - 1]);
}
int k = 0;
pref = 0;
for(int j = 1; j <= len[i]; j++) {
while(k < len[i - 1] && fish[i - 1][k + 1].fi <= reach[i][j]) {
k++;
pref += fish[i - 1][k].se;
}
inc[i][j] = pref + v[k];
// itt az is benne van, ha az elozo
// reach-je a mostani fele log es esetleg
// valamit include-ol, de az nem szamit,
// mert nem adjuk hozza, es kulon esetben
// viszont lekezeljuk
}
}
// dec
{
vector<int> v(1 + len[i - 1]);
int pref = 0;
for(int j = 1; j <= len[i]; j++) {
pref += fish[i][j].se;
}
int k = len[i];
for(int j = len[i - 1]; j >= 1; j--) {
while(fish[i][k].fi > reach[i - 1][j]) {
pref -= fish[i][k].se;
k--;
}
v[j] = dec[i - 1][j] + pref;
if(j < len[i - 1]) {
v[j] = max(v[j], v[j + 1]);
}
}
k = len[i - 1];
pref = 0;
for(int j = len[i - 1]; j >= 1; j--) {
pref += fish[i][j].se;
}
for(int j = len[i]; j >= 0; j--) {
while(k > 0 && fish[i][j].fi <= reach[i - 1][k - 1]) {
k--;
}
dec[i][j] = v[k] - pref;
// itt is van hasonlo eset ami
// mashol kezelve van
pref -= fish[i][j].se;
}
}
// sm
if(i >= 2) {
vector<int> v(1 + len[i - 2]);
int pref = 0;
for(int j = 1; j <= len[i - 1]; j++) {
pref += fish[i - 1][j].se;
}
int k = len[i - 1];
for(int j = len[i - 2]; j >= 1; j--) {
while(fish[i - 1][k].fi > reach[i - 2][j]) {
pref -= fish[i - 1][k].se;
k--;
}
v[j] = dec[i - 2][j] + pref;
if(j < len[i - 2]) {
v[j] = max(v[j], v[j + 1]);
}
}
for(int j = 1; j <= len[i]; j++) {
inc[i][j] = max(inc[i][j], v[1]);
}
int maxi_prev = 0;
for(int j = 1; j <= len[i - 2]; j++) {
maxi_prev = max(maxi_prev, dec[i - 2][j]);
}
k = 0;
pref = 0;
for(int j = 1; j <= len[i]; j++) {
while(k < len[i - 1] && fish[i - 1][k + 1].fi <= reach[i][j]) {
k++;
pref += fish[i - 1][k].se;
}
inc[i][j] = max(inc[i][j], maxi_prev + pref);
}
}
// bi
bi[i] = inc[i][len[i]];
// other
dec[i][len[i]] = max(dec[i][len[i]], bi[i]);
}
int ans = 0;
for(int x : inc[n]) {
ans = max(ans, x);
}
for(int y : dec[n]) {
ans = max(ans, y);
}
ans = max(ans, sm[n]);
ans = max(ans, bi[n]);
return ans;
}
int max_weights(signed N, signed M, vector<signed> X, vector<signed> Y, vector<signed> W) {
n = N, m = M;
for(int i = 0; i <= n; i++) {
fish[i].pb(mp(0, 0));
}
for(int i = 0; i < m; i++) {
fish[X[i] + 1].pb(mp(Y[i] + 1, W[i]));
}
for(int i = 1; i <= n; i++) {
sort(fish[i].begin(), fish[i].end());
}
return solve();
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
55 ms |
30916 KB |
Output is correct |
2 |
Correct |
66 ms |
34248 KB |
Output is correct |
3 |
Correct |
28 ms |
25428 KB |
Output is correct |
4 |
Correct |
28 ms |
25428 KB |
Output is correct |
5 |
Correct |
117 ms |
51748 KB |
Output is correct |
6 |
Correct |
133 ms |
51280 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
4 ms |
10332 KB |
1st lines differ - on the 1st token, expected: '2', found: '1' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
29 ms |
25448 KB |
Output is correct |
2 |
Incorrect |
28 ms |
25400 KB |
1st lines differ - on the 1st token, expected: '882019', found: '0' |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
3 ms |
10332 KB |
1st lines differ - on the 1st token, expected: '3', found: '2' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
3 ms |
10332 KB |
1st lines differ - on the 1st token, expected: '3', found: '2' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
3 ms |
10332 KB |
1st lines differ - on the 1st token, expected: '3', found: '2' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
29 ms |
25448 KB |
Output is correct |
2 |
Incorrect |
28 ms |
25400 KB |
1st lines differ - on the 1st token, expected: '882019', found: '0' |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
55 ms |
30916 KB |
Output is correct |
2 |
Correct |
66 ms |
34248 KB |
Output is correct |
3 |
Correct |
28 ms |
25428 KB |
Output is correct |
4 |
Correct |
28 ms |
25428 KB |
Output is correct |
5 |
Correct |
117 ms |
51748 KB |
Output is correct |
6 |
Correct |
133 ms |
51280 KB |
Output is correct |
7 |
Incorrect |
4 ms |
10332 KB |
1st lines differ - on the 1st token, expected: '2', found: '1' |
8 |
Halted |
0 ms |
0 KB |
- |