#include "bits/stdc++.h"
#include "wombats.h"
#define ll long long
#define all(v) v.begin() , v.end()
#define sz(a) (ll)a.size()
using namespace std;
const ll C = 205;
const ll R = 5095;
const ll BL = 30;
const ll INF = 3000000005;
ll dp[4*(R/BL)][C][C],calc[R/BL][C][C];
ll H[R][C],V[R][C],Lf[R],Rg[R],n,m;
inline void upd_block(ll ind){
ll Old[C][C],New[C][C];
for(ll i=0;i<C;i++) for(ll j=0;j<C;j++) Old[i][j] = New[i][j] = INF;
for(ll i=0;i<m;i++){
ll cur = 0;
Old[i][i] = V[Lf[ind]][i];
for(ll j=i-1;j>=0;j--){
cur += H[Lf[ind]][j];
Old[i][j] = cur + V[Lf[ind]][j];
}
cur = 0;
for(ll j=i+1;j<m;j++){
cur += H[Lf[ind]][j-1];
Old[i][j] = cur + V[Lf[ind]][j];
}
}
for(ll z=Lf[ind]+1;z<=Rg[ind];z++){
for(ll i=0;i<C;i++) for(ll j=0;j<C;j++) New[i][j] = INF;
ll sum[C],cur_sum = 0;
for(ll i=0;i<m;i++){
sum[i] = cur_sum;
cur_sum += H[z][i];
}
for(ll i=0;i<m;i++){
ll pre_dp[C],suf_dp[C];
for(ll j=0;j<C;j++) pre_dp[j]=suf_dp[j]=INF;
ll hm = INF;
for(ll j=0;j<m;j++){
hm = min(hm, Old[i][j] - sum[j]);
pre_dp[j] = hm;
}
hm = INF;
for(ll j=m-1;j>=0;j--){
hm = min(hm, Old[i][j] + sum[j]);
suf_dp[j] = hm;
}
for(ll j=0;j<m;j++){
New[i][j] = min(New[i][j], V[z][j] + pre_dp[j] + sum[j]);
New[i][j] = min(New[i][j], V[z][j] + suf_dp[j] - sum[j]);
}
}
for(ll i=0;i<C;i++) for(ll j=0;j<C;j++) Old[i][j] = New[i][j];
}
for(ll i=0;i<C;i++) for(ll j=0;j<C;j++) calc[ind][i][j] = Old[i][j];
}
inline void merge(ll rt){
for(ll i=0;i<C;i++) for(ll j=0;j<C;j++) dp[rt][i][j] = INF;
for(ll i=0;i<C;i++)
for(ll j=0;j<C;j++)
for(ll k=0;k<C;k++)
dp[rt][i][k] = min(dp[rt][i][k], dp[rt*2][i][j] + dp[rt*2+1][j][k]);
}
void build(ll rt,ll l,ll r){
if(l==r){
for(ll i=0;i<C;i++) for(ll j=0;j<C;j++) dp[rt][i][j] = calc[l][i][j];
return;
}
ll mid=(l+r)/2;
build(rt*2,l,mid),build(rt*2+1,mid+1,r);
merge(rt);
}
void upd(ll rt,ll l,ll r,ll ind){
if(l > ind || r < ind) return;
if(l == r){
for(ll i=0;i<C;i++) for(ll j=0;j<C;j++) dp[rt][i][j] = calc[ind][i][j];
return;
}
ll mid = (l+r)/2;
upd(rt*2,l,mid,ind),upd(rt*2+1,mid+1,r,ind);
merge(rt);
}
void init(int _r, int _c, int _H[5000][200], int _V[5000][200]){
n = _r, m = _c;
for(ll i=0;i<n;i++){
ll u = i / BL;
Rg[u] = i;
if(i % BL == 0) Lf[u] = i;
}
for(ll i=0;i<n;i++) for(ll j=0;j+1<m;j++) H[i][j] = _H[i][j];
for(ll i=0;i+1<n;i++) for(ll j=0;j<m;j++) V[i][j] = _V[i][j];
for(ll i=0;i<=(n-1)/BL;i++) upd_block(i);
build(1,0,(n-1)/BL);
}
void changeH(int P, int Q, int W){
H[P][Q] = W;
upd_block(P/BL);
upd(1,0,(n-1)/BL,P/BL);
}
void changeV(int P, int Q, int W){
V[P][Q] = W;
upd_block(P/BL);
upd(1,0,(n-1)/BL,P/BL);
}
int escape(int V1, int V2){
return (int) dp[1][V1][V2];
}
# | 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... |