用一种奇异方法,76pts,欢迎围观
查看原帖
用一种奇异方法,76pts,欢迎围观
1391256
LTTXiaochuan楼主2024/8/9 09:12

大概类似悬线法(但其实我不知道悬线法是啥qwq可能是根悬着的线来扫描吧)

模拟这种方法,枚举极大子矩形,奇怪的是居然WA两个点 甚至TLE#11 不应该呀??最坏的情况就是F R F R...都不会TLE,那#11是啥玩意啊...... (测评记录)

代码如下,有点长,但其实大多是重复的函数,可读性还是比较高(我觉得吧qwq)的

#include <bits/stdc++.h>
using namespace std;
const int N=1005;
struct node{
	int x,y,c;
}que[N*N];
int n,m,a[N][N],rct,maxs;
int search_left(int hx,int ex,int y)
{
	if(y==1) return ex-hx+1;
	int ey=1;
	for(int i=y; i>=1; i--)
	{
		int flag=0;
		for(int j=hx; j<=ex; j++)
			if(a[j][i]==2)
			{
				flag=1;
				break;
			}
		if(flag)
		{
			ey=i+1;
			break;
		}
	}
	return (ex-hx+1)*(y-ey+1);
}
int search_right(int hx,int ex,int y)
{
	if(y==m) return ex-hx+1;
	int ey=m;
	for(int i=y; i<=m; i++)
	{
		int flag=0;
		for(int j=hx; j<=ex; j++)
			if(a[j][i]==2)
			{
				flag=1;
				break;
			}
		if(flag)
		{
			ey=i-1;
			break;
		}
	}
	return (ex-hx+1)*(ey-y+1);
}
void search_up(int x,int y)
{
	int ex=x-1,hx=1;
	for(int i=ex; i>=1; i--)
		if(a[i][y]==2)
		{
			hx=i+1;
			break;
		}
	maxs=max(maxs,search_left(hx,ex,y)+search_right(hx,ex,y)-(ex-hx+1));
}
void search_down(int x,int y)
{
	int hx=x+1,ex=n;
	for(int i=hx; i<=n; i++)
		if(a[i][y]==2)
		{
			ex=i-1;
			break;
		}
	maxs=max(maxs,search_left(hx,ex,y)+search_right(hx,ex,y)-(ex-hx+1));
}
int main()
{
	cin>>n>>m;
	for(int i=1; i<=n; i++)
		for(int j=1; j<=m; j++)
		{
			char c;
			scanf(" %c",&c);
			if(c=='R')
			{
				a[i][j]=2;
				rct++;
				que[rct].x=i;
				que[rct].y=j;
			}
			else a[i][j]=1;
		}
	search_down(0,1);
	search_down(0,m);
	search_up(n+1,1);
	search_up(n+1,m);
	for(int i=1; i<=rct; i++)
	{
		if(que[i].c==1) continue;
		int x=que[i].x;
		int y=que[i].y;
		if(x>1) search_up(x,y);
		if(x<n) search_down(x,y);
	}
	cout<<maxs*3;
	return 0;
}
2024/8/9 09:12
加载中...