提交时间:2024-01-02 13:49:17

运行 ID: 118932

#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(){ 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]); dp[i][0]=dp[i][1]=-B; if(!vis[i])ph(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",ans); return 0; }