#include "wombats.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
#define pb push_back
#define vi vector<int>
#define vl vector<ll>
#define pi pair<int, int>
#define pl pair<ll,ll>
#define all(x) (x).begin(),(x).end()
array<array<int,200>,5000> v,h;
int n,m;
struct segTree {
struct node {
array<array<int,200>,200> dp;
void build(int i) {
int l=i*10;
int r=min(l+10,n-1);
for (int j=0; j<m; j++) {
dp[j][j]=0;
for (int j2=j+1; j2<m; j2++) {
dp[j][j2]=dp[j][j2-1]+h[l][j2-1];
dp[j2][j]=dp[j][j2];
}
}
for (int i=l; i<r; i++) {
for (int j=0; j<m; j++) {
for (int j2=0; j2<m; j2++) {
dp[j][j2]+=v[i][j2];
}
for (int j2=0; j2<m-1; j2++) {
dp[j][j2+1]=min(dp[j][j2+1],dp[j][j2]+h[i+1][j2]);
}
for (int j2=m-2; j2>=0; j2--) {
dp[j][j2]=min(dp[j][j2],dp[j][j2+1]+h[i+1][j2]);
}
}
}
}
};
array<array<int,200>,200> opt;
void unite(int vv) {
for (int i=m-1; i>=0; i--) {
for (int j=0; j<m; j++) {
nodes[vv].dp[i][j]=1e9;
int l=(j==0?0:opt[i][j-1]);
int r=(i==m-1?m-1:opt[i+1][j]);
for (int k=l; k<=r; k++) {
if (nodes[vv].dp[i][j]>nodes[2*vv].dp[i][k]+nodes[2*vv+1].dp[k][j]) {
opt[i][j]=k;
nodes[vv].dp[i][j]=nodes[2*vv].dp[i][k]+nodes[2*vv+1].dp[k][j];
}
}
}
}
}
array<node,2000> nodes;
void build(int vv, int tl, int tr) {
if (tl==tr) {
nodes[vv].build(tl);
return;
}
int tm=tl+(tr-tl)/2;
build(2*vv,tl,tm);
build(2*vv+1,tm+1,tr);
unite(vv);
}
void update(int ind, int vv, int tl, int tr) {
if (tl==tr) {
nodes[vv].build(tl);
return;
}
int tm=tl+(tr-tl)/2;
if (ind<=tm) {
build(2*vv,tl,tm);
}
else {
build(2*vv+1,tm+1,tr);
}
unite(vv);
}
void update(int ind) {
update(ind/10,1,0,(n-2)/10);
}
int get(int l, int r) {
return nodes[1].dp[l][r];
}
};
segTree dat;
void init(int r, int c, int hh[5000][200], int vv[5000][200]) {
n=r;
m=c;
for (int i=0; i<n; i++) {
for (int j=0; j<m-1; j++) {
h[i][j]=hh[i][j];
}
}
for (int i=0; i<n-1; i++) {
for (int j=0; j<m; j++) {
v[i][j]=vv[i][j];
}
}
dat.build(1,0,(n-2)/10);
}
void changeH(int p, int q, int w) {
h[p][q]=w;
if (p!=0) {
dat.update(p-1);
}
if (p!=n-1) {
dat.update(p);
}
}
void changeV(int p, int q, int w) {
v[p][q]=w;
dat.update(p);
}
int escape(int v1, int v2) {
return dat.get(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... |