This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
#include"wombats.h"
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int MAXN = 5e3 + 5;
const int MAXM = 2e2 + 5;
const int B = 32;
const int MAXP = MAXN / B + 1;
int n,m;
int a[MAXN][MAXM], b[MAXN][MAXM];
struct Data
{
int l, r, f[MAXM][MAXM];
inline void rebuild(void)
{
memset(f,0x3f,sizeof(f));
for(int i=1; i<=m; ++i) f[i][i] = 0;
for(int k=l; k<=r; ++k)
{
for(int i=1; i<=m; ++i)
{
for(int j=m-1; j>=1; --j)
f[i][j] = min(f[i][j], f[i][j+1] + a[k][j]);
for(int j=2; j<=m; ++j)
f[i][j] = min(f[i][j], f[i][j-1] + a[k][j-1]);
}
if(k == r) break;
for(int i=1; i<=m; ++i)
for(int j=1; j<=m; ++j)
f[i][j] += b[k][j];
}
}
inline void merge(const Data &p,const Data &q)
{
static int pt[MAXM][MAXM];
memset(f,0x3f,sizeof(f));
for(int k=-m+1; k<m; ++k)
for(int i=1,j=i+k; i<=m; ++i, ++j) if(j >= 1 && j <= m)
{
int vl = j>1? pt[i][j-1]: 1, vr = i<m? pt[i+1][j]: m;
for(int mid=vl; mid<=vr; ++mid)
{
int cur = p.f[i][mid] + q.f[mid][j];
if(cur < f[i][j])
f[i][j] = cur, pt[i][j] = mid;
}
}
}
};
struct Segment_Tree
{
Data tree[MAXP<<2];
#define ls(u) ((u)<<1)
#define rs(u) ((u)<<1|1)
#define lson(u) ls(u),l,mid
#define rson(u) rs(u),mid+1,r
inline void push_up(int u){ tree[u].merge(tree[ls(u)], tree[rs(u)]);}
void set_lr(int u,int l,int r,int q,int ql,int qr)
{
if(l == r){ tree[u].l = ql; tree[u].r = qr; return;}
int mid = (l+r)>>1;
if(q<=mid) set_lr(lson(u),q,ql,qr);
else set_lr(rson(u),q,ql,qr);
}
void update(int u,int l,int r,int q)
{
if(l == r){ tree[u].rebuild(); return;}
int mid = (l+r)>>1;
if(q<=mid) update(lson(u),q);
else update(rson(u),q);
push_up(u);
}
int query(int x,int y){ return tree[1].f[x][y];}
}tree;
int pcnt, bid[MAXN];
void init(int _n,int _m,int _a[5000][200],int _b[5000][200])
{
n = _n; m = _m;
for(int i=1; i<=n; ++i)
for(int j=1; j<m; ++j) a[i][j] = _a[i-1][j-1];
for(int i=1; i<n; ++i)
for(int j=1; j<=m; ++j) b[i][j] = _b[i-1][j-1];
pcnt = (n - 1 + B - 1) / B;
int curp = 0; bid[n] = -1;
for(int i=1,j; i<n; i=j)
{
j = min(n, i + B);
tree.set_lr(1,1,pcnt, ++curp, i, j);
tree.update(1,1,pcnt, curp);
for(int k=i; k<j; ++k) bid[k] = curp;
}
}
void changeH(int x,int y,int k)
{
++x; ++y;
a[x][y] = k;
if(x < n) tree.update(1,1,pcnt, bid[x]);
if(x > 1 && bid[x-1] != bid[x]) tree.update(1,1,pcnt, bid[x-1]);
}
void changeV(int x,int y,int k)
{
++x; ++y;
b[x][y] = k;
tree.update(1,1,pcnt, bid[x]);
}
int escape(int x,int y)
{
++x; ++y;
return tree.query(x,y);
}
//#define He_Ren
#ifdef He_Ren
int main(void)
{
int _n,_m;
static int _a[5000][200], _b[5000][200];
scanf("%d%d",&_n,&_m);
for(int i=0; i<_n; ++i)
for(int j=0; j<_m-1; ++j)
scanf("%d",&_a[i][j]);
for(int i=0; i<_n-1; ++i)
for(int j=0; j<_m; ++j)
scanf("%d",&_b[i][j]);
init(_n,_m,_a,_b);
int Q;
scanf("%d",&Q);
while(Q--)
{
int oper;
scanf("%d",&oper);
if(oper == 1)
{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
changeH(x,y,k);
}
else if(oper == 2)
{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
changeV(x,y,k);
}
else
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",escape(x,y));
}
}
return 0;
}
#endif
Compilation message (stderr)
grader.c: In function 'int main()':
grader.c:15:6: warning: variable 'res' set but not used [-Wunused-but-set-variable]
15 | int res;
| ^~~
# | 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... |