BZOJ 3208 花神的秒题计划Ⅰ

Posted on 2017-03-12 22:07  ziliuziliu  阅读(119)  评论(0编辑  收藏  举报

做题一定要看数据范围。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 750
#define maxm 1000050
using namespace std;
int n,m,a,b,c,d,dp[maxn][maxn],h[maxn][maxn],ans=0;
int dx[]={0,-1,1,0,0},dy[]={0,0,0,-1,1};
bool vis[maxn][maxn];
char s[10];
bool judge(int x,int y)
{
    return (x>=1 && x<=n && y>=1 && y<=n);
}
int get_dp(int x,int y)
{
    if (dp[x][y]) return dp[x][y];
    vis[x][y]=dp[x][y]=1;
    for (int i=1;i<=4;i++)
    {
        int tx=x+dx[i],ty=y+dy[i];
        if (judge(tx,ty) && !vis[tx][ty] && h[tx][ty]>h[x][y]) 
            dp[x][y]=max(dp[x][y],get_dp(tx,ty)+1);
    }
    vis[x][y]=0;return dp[x][y];
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
            scanf("%d",&h[i][j]);
    scanf("%d",&m);
    for (int i=1;i<=m;i++)
    {
        scanf("%s",s);
        if (s[0]=='C') {scanf("%d%d%d",&a,&b,&c);h[a][b]=c;}
        else if (s[0]=='S' || 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++)
                    vis[i][j]=(s[0]=='S');
        }
        else
        {
            memset(dp,0,sizeof(dp));ans=0;
            for (int i=1;i<=n;i++)
                for (int j=1;j<=n;j++)
                    if (!vis[i][j]) ans=max(ans,get_dp(i,j));
            printf("%d\n",ans);
        }
    }
}