[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 }
View Code

 

posted @ 2017-01-20 20:33  KingSann  阅读(132)  评论(0)    收藏  举报