显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define cpy(a,b) copy(begin(a),end(a),begin(b))
#define ld long double
#define dot(x) fixed<<setprecision(x)
#define foru(a,b,c) for(ll a=b;a<=c;a++)
ll n,q,p[3005],sz[2253000],f[2253000],ans;
char a[1505][1505];
vector<vector<ll>>son(2253000);
ll deal(ll x,ll y){
if(x<=n&&y<=n)return (x-1)*n+y;
if(x==n+1)return n*n+n+y;
return n*n+x;
}
void dfs(ll x,ll y,ll fa){
ll u=deal(x,y),ux=deal(x-1,y),uy=deal(x,y-1);
sz[u]=1;
f[u]=fa;
if(a[x][y-1]=='R'){
son[u].push_back(uy);
dfs(x,y-1,fa);
sz[u]+=sz[uy];
}
if(a[x-1][y]=='D'){
son[u].push_back(ux);
dfs(x-1,y,fa);
sz[u]+=sz[ux];
}
}
void ddfs(ll x,ll y,ll fa,ll c){
ans+=c;
f[deal(x,y)]=fa;
if(a[x][y-1]=='R'){
ddfs(x,y-1,fa,c);
}
if(a[x-1][y]=='D'){
ddfs(x-1,y,fa,c);
}
}
int main(){
cin>>n;
foru(i,1,n){
foru(j,1,n){
cin>>a[i][j];
}
cin>>p[i];
}
foru(i,n+1,n*2)cin>>p[i];
foru(i,1,n){
if(a[i][n]=='R'){
son[n*n+i].push_back(deal(i,n));
dfs(i,n,i);
sz[n*n+i]=sz[deal(i,n)];
}
}
foru(i,n+1,n*2){
if(a[n][i-n]=='D'){
son[n*n+i].push_back(deal(n,i-n));
dfs(n,i-n,i);
sz[n*n+i]=sz[deal(n,i-n)];
}
}
foru(i,1,n*2){
ans+=p[i]*sz[n*n+i];
}
cout<<ans<<endl;
foru(i,1,n){
f[deal(n+1,i)]=i+n;
f[deal(i,n+1)]=i;
}
cin>>q;
while(q--){
ll x,y;
cin>>x>>y;
ll tmp=0;
if(a[x][y]=='R'){
tmp=f[deal(x+1,y)],a[x][y]='D';
}else{
tmp=f[deal(x,y+1)],a[x][y]='R';
}
ll v=p[tmp];
ll c=v-p[f[deal(x,y)]];
ddfs(x,y,tmp,c);
cout<<ans<<endl;
}
return 0;
}