提交时间:2022-10-04 11:27:40

运行 ID: 57476

#include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; typedef long long ll; const int maxn=1002; const ll B=1e15,C=2e15+21; vector<int>ed[maxn*maxn]; char r[maxn]; int val[maxn*maxn],Next[maxn*maxn],vis[maxn*maxn],st[maxn*maxn],top,I[maxn*maxn],Ir[maxn*maxn],n,m; ll dp[maxn*maxn][2],g[maxn*maxn]; inline void dddd(vector<int>&lq) { static ll sum[2*maxn*maxn];static int dd[2*maxn*maxn]; int zr=lq.size(); sum[0]=0; for(int i=1; i<=2*zr; i++) sum[i]=sum[i-1]+lq[((zr+1>i)?(i-1):(i-zr-1))]; int fr=0,ba=0; for(int i=0; i<=2*zr; i++) { while(ba<fr && sum[dd[fr-1]]<sum[i]) fr--; dd[fr++]=i; if(i-dd[ba]>=zr) ba++; if(i>=zr) g[i-zr]=sum[dd[ba]]-sum[i-zr]; } } inline void Upd(ll &x,ll y) { if(y>x) x=y; } inline void ph(int u) { if(I[u]) { vector<int>lq; for(int i=I[u]; i<=top; i++) Ir[st[i]]=1,lq.push_back(st[i]); int zr=lq.size(); vector<int>wzj(zr); for(int u=0; u<2; u++) { for(int i=0; i<zr; i++) if(i%2==u) wzj[i]=val[lq[i]]; else wzj[i]=-val[lq[i]]; dddd(wzj); for(int i=0; i<zr; i++) if(i%2==0) Upd(dp[lq[i]][u],g[i]); else Upd(dp[lq[i]][!u],g[i]); reverse(wzj.begin(),wzj.end()); dddd(wzj); for(int i=0; i<zr; i++) if(i%2==0) Upd(dp[lq[(zr-i)%zr]][u],g[i]); else Upd(dp[lq[(zr-i)%zr]][!u],g[i]); } for(int i=0; i<zr; i++) Upd(dp[lq[i]][0],0ll); for(int i=0; i<zr; i++) Upd(dp[lq[i]][1],0ll); return ; } if(vis[u] || Next[u]==-1) return ; vis[u]=1,st[++top]=u,I[u]=top; ph(Next[u]); top--,I[u]=0; } inline void tdp(int u) { for (int i=0,v; i<(int)ed[u].size(); i++) { v=ed[u][i]; if (Ir[v]) continue; dp[v][0]=val[v]+max(0ll, dp[u][1]); dp[v][1] =-val[v]+max(0ll, dp[u][0]); tdp(v); } } int main() { // freopen("J4.in","r",stdin); // freopen("J4.out","w",stdout); int n,m; scanf("%d%d",&n,&m); for(int i=0; i<n; i++) { scanf("%s", r); for (int j=0; j<m; j++) { int pp, qq; if (r[j]=='^') pp=i-1,qq=j; else if (r[j]=='v') pp=i+1,qq=j; else if (r[j]=='<') pp=i,qq=j-1; else pp=i,qq=j+1; if (0<=pp && pp<n && 0<=qq && qq<m) { Next[i*m+j]=pp*m+qq; ed[pp*m+qq].push_back(i*m+j); } else Next[i*m+j]=-1; } } for (int i=0; i<n*m; i++) scanf("%d",&val[i]); for (int i=0; i<n*m; i++) dp[i][0]=dp[i][1]=-B; for (int i=0; i<n*m; i++) if (!vis[i]) ph(i); for (int i=0; i<n*m; i++) { if (Ir[i]) tdp(i); if (Next[i]==-1) { dp[i][0]=val[i]; dp[i][1]=-val[i]; tdp(i); } } ull ans=0,c=1; for (int i=0; i<n*m; i++) ans+=(ull)(dp[i][0]+B)*c,c*=C; printf("%llu\n",ans); return 0; }