[bzoj3208]花神的秒题计划Ⅰ
瞬间脑补出某到经典的记忆化搜索。。然后觉得应该没那么简单。。
然而。。——“Q、S、B操作总数≤100”
???真的是大暴力啊。。
于是就暴力吧。。。

1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <cstdlib> 5 #include <map> 6 #include <string> 7 #include <vector> 8 #include <stack> 9 #include <cmath> 10 #include <queue> 11 #include <cstdio> 12 #include <set> 13 using namespace std; 14 15 const int N=1000; 16 int h[N][N],v[N][N],dp[N][N],n,m,a,b,c,d;char s[5]; 17 int mv[10][10]={{0,1},{0,-1},{1,0},{-1,0}}; 18 19 void dfs(int x,int y){ 20 if(dp[x][y]!=-1)return; 21 dp[x][y]=0; 22 for(int i=0;i<4;i++){ 23 int xx=x+mv[i][0],yy=y+mv[i][1]; 24 if(1<=xx&&xx<=n&&1<=yy&&yy<=n&&!v[xx][yy]&&h[xx][yy]<h[x][y]) 25 dfs(xx,yy),dp[x][y]=max(dp[x][y],dp[xx][yy]+1); 26 } 27 } 28 29 int main(){ 30 scanf("%d",&n); 31 for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&h[i][j]); 32 scanf("%d",&m); 33 while(m--){ 34 scanf("%s",s); 35 if(s[0]=='C')scanf("%d%d%d",&a,&b,&c),h[a][b]=c; 36 if(s[0]=='S'){scanf("%d%d%d%d",&a,&b,&c,&d);for(int i=a;i<=c;i++)for(int j=b;j<=d;j++)v[i][j]=1;} 37 if(s[0]=='B'){scanf("%d%d%d%d",&a,&b,&c,&d);for(int i=a;i<=c;i++)for(int j=b;j<=d;j++)v[i][j]=0;} 38 if(s[0]=='Q'){ 39 memset(dp,-1,sizeof(dp)); 40 for(int i=1;i<=n;i++) 41 for(int j=1;j<=n;j++) 42 if(!v[i][j]) 43 dfs(i,j),dp[0][0]=max(dp[0][0],dp[i][j]); 44 printf("%d\n",dp[0][0]+1); 45 } 46 } 47 }