BZOJ3208: 花神的秒题计划Ⅰ
BZOJ3208: 花神的秒题计划Ⅰ
https://lydsy.com/JudgeOnline/problem.php?id=3208
分析:
- 暴力模拟,每次询问记忆化搜索。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <set>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
#define N 750
int a[N][N],n,m,c[N][N],b[N][N];
char opt[10];
int f[N][N];
int tx[]={0,1,0,-1};
int ty[]={1,0,-1,0};
int dp(int x,int y) {
if(b[x][y]>0) return 0;
if(f[x][y]!=-1) return f[x][y];
f[x][y]=0;
int i;
for(i=0;i<4;i++) {
int dx=x+tx[i], dy=y+ty[i];
if(dx>=1&&dx<=n&&dy>=1&&dy<=n&&a[dx][dy]<a[x][y]) {
f[x][y]=max(f[x][y],dp(dx,dy));
}
}
f[x][y]++;
return f[x][y];
}
int main() {
scanf("%d",&n);
int i,j,x,y,z,w;
for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&a[i][j]);
int m;
scanf("%d",&m);
while(m--) {
scanf("%s",opt+1);
if(opt[1]=='C') {
scanf("%d%d%d",&x,&y,&z);
a[x][y]=z;
}else if(opt[1]=='S') {
scanf("%d%d%d%d",&x,&y,&z,&w);
for(i=x;i<=z;i++) for(j=y;j<=w;j++) b[i][j]=1;
}else if(opt[1]=='B') {
scanf("%d%d%d%d",&x,&y,&z,&w);
for(i=x;i<=z;i++) for(j=y;j<=w;j++) b[i][j]=0;
}else {
for(i=1;i<=n;i++)for(j=1;j<=n;j++)f[i][j]=-1;
int ans=0;
for(i=1;i<=n;i++) for(j=1;j<=n;j++) {
ans=max(ans,dp(i,j));
}
printf("%d\n",ans);
}
}
}