显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=1505;
int n,a[N][N],b[N][N],ans;
char grid[N][N];
bool v[N][N];
int x,y;
int main(){
freopen("zunxun.in","r",stdin);
freopen("zunxun.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++){
char s[N];
scanf("%s",s);
for(int j=1;j<=n;j++){
grid[i][j]=s[j-1];
v[i][j]=(s[j-1]=='R');
}
scanf("%d",&a[i][n+1]);
}
for(int i=1;i<=n;i++){
scanf("%d",&a[n+1][i]);
}
for(int i=1;i<=n;i++){
a[n+1][i] = a[n+1][i];
a[i][n+1] = a[i][n+1];
}
for(int i=n;i>=1;i--){
for(int j=n;j>=1;j--){
if(v[i][j]){
a[i][j]=a[i][j+1];
}else{
a[i][j]=a[i+1][j];
}
ans+=a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
b[i][j]=1;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(b[i][j]>0){
if(v[i][j]){
b[i][j+1]+=b[i][j];
}else{
b[i+1][j]+=b[i][j];
}
}
}
}
printf("%d\n",ans);
int q;
scanf("%d",&q);
while(q--){
scanf("%d%d",&x,&y);
int tx=x,ty=y;
while(tx<=n&&ty<=n){
if(v[tx][ty]){
b[tx][ty+1]-=b[x][y];
ty++;
}else{
b[tx+1][ty]-=b[x][y];
tx++;
}
}
ans-=b[x][y]*a[tx][ty];
v[x][y]=!v[x][y];
tx=x,ty=y;
while(tx<=n&&ty<=n){
if(v[tx][ty]){
b[tx][ty+1]+=b[x][y];
ty++;
}else{
b[tx+1][ty]+=b[x][y];
tx++;
}
}
ans+=b[x][y]*a[tx][ty];
printf("%d\n",ans);
}
return 0;
}