1 条题解

  • 0
    @ 2025-10-8 17:08:09
    #include <bits/stdc++.h>
    using namespace std;
    const int N = 710;
    const int dx[4] = {0, 1, 0, -1};
    const int dy[4] = {1, 0, -1, 0};
    int ans, n, m, a[N][N], mark[N][N], dp[N][N];
    char s[2];
    int dfs(int x, int y)
    {
    	if (dp[x][y]) return dp[x][y];
    	dp[x][y] = 1;
    	for (int i = 0; i <= 3; i++)
    	{
    		int xx = x + dx[i], yy = y + dy[i];
    		if (mark[xx][yy] || xx < 1 || xx > n || yy < 1 || yy > n || a[xx][yy] >= a[x][y])
    			continue;
    		dp[x][y] = max(dp[x][y], dfs(xx, yy) + 1);
    	}
    	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", &a[i][j]);
    	scanf("%d", &m);
    	int aa, bb, cc, dd;
    	while (m--)
    	{
    		scanf("%s", s);
    		if (s[0] == 'C')
    		{
    			scanf("%d%d%d", &aa, &bb, &cc);
    			a[aa][bb] = cc;
    		}
    		else if (s[0] == 'S')
    		{
    			scanf("%d%d%d%d", &aa, &bb, &cc, &dd);
    			for (int i = aa; i <= cc; i++)
    				for (int j = bb; j <= dd; j++)
    					mark[i][j] = 1;
    		}
    		else if (s[0] == 'B')
    		{
    			scanf("%d%d%d%d", &aa, &bb, &cc, &dd);
    			for (int i = aa; i <= cc; i++)
    				for (int j = bb; j <= dd; j++)
    					mark[i][j] = 0;
    		}
    		else if (s[0] == 'Q')
    		{
    			memset(dp, 0, sizeof(dp));
    			ans = 0;
    			for (int i = 1; i <= n ; i++)
    				for (int j = 1; j <= n ; j++)
    					if (!mark[i][j])
    						ans = max(ans, dfs(i, j));
    			printf("%d\n", ans);
    		}
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    4873
    时间
    1000ms
    内存
    512MiB
    难度
    6
    标签
    递交数
    34
    已通过
    13
    上传者