求调,90pts,2关注,#8没了
查看原帖
求调,90pts,2关注,#8没了
669171
z_yq楼主2024/11/26 16:48
#include<bits/stdc++.h>
#define ll long long
#define P pair<ll,ll>
#define fi first
#define se second
using namespace std;
const ll N=2e2+9;
ll n,m,x,y,k,a[N][N],dp[N][N][N];
queue<ll>que;
int main()
{
	cin>>n>>m>>x>>y>>k;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			char tmp;
			cin>>tmp;
			a[i][j]=(tmp=='.'?0:1);
		}		
	memset(dp,128,sizeof(dp));
	dp[0][x][y]=0;
	for(int i=1;i<=k;i++)
	{
		ll st,ed,tp;
		cin>>st>>ed>>tp;tp--;
		if(tp==0)
		{
			for(int y=1;y<=m;y++)
			{
				while(!que.empty())que.pop();
				for(int x=n;x>=1;x--)
					if(!a[x][y])
					{
						dp[i][x][y]=dp[i-1][x][y];
						while(!que.empty() && (que.front()-x>ed-st+1 || dp[i-1][que.front()][y]+que.front()-x<=dp[i-1][x][y])) que.pop();
						if(!que.empty())dp[i][x][y]=max(dp[i][x][y],dp[i-1][que.front()][y]+que.front()-x);
						que.push(x);
					}else while(!que.empty())que.pop();
			}
		}
		if(tp==1)
		{
			for(int y=1;y<=m;y++)
			{
				while(!que.empty())que.pop();
				for(int x=1;x<=n;x++)
					if(!a[x][y])
					{
						dp[i][x][y]=dp[i-1][x][y];
						while(!que.empty() && (x-que.front()>ed-st+1  || dp[i-1][que.front()][y]+x-que.front()<=dp[i-1][x][y])) que.pop();
						if(!que.empty())dp[i][x][y]=max(dp[i][x][y],dp[i-1][que.front()][y]+x-que.front());
						que.push(x);
					}else while(!que.empty())que.pop();
			}
		}
		if(tp==2)
		{
			for(int x=1;x<=n;x++)
			{
				while(!que.empty())que.pop();
				ll maxx=INT_MIN;
				for(int y=m;y>=1;y--)
					if(!a[x][y])
					{
						dp[i][x][y]=dp[i-1][x][y];
						while(!que.empty() && ((que.front()-y>ed-st+1) || (dp[i-1][x][que.front()]+que.front()-y<=dp[i-1][x][y])))que.pop();
						if(!que.empty())dp[i][x][y]=max(dp[i][x][y],dp[i-1][x][que.front()]+que.front()-y);
						que.push(y);
					}else while(!que.empty())que.pop();
			}
		}
		if(tp==3)
		{
			for(int x=1;x<=n;x++)
			{
				while(!que.empty())que.pop();
				for(int y=1;y<=m;y++)
					if(!a[x][y])
					{
						dp[i][x][y]=dp[i-1][x][y];
						while(!que.empty() && (y-que.front()>ed-st+1 || dp[i-1][x][que.front()]+y-que.front()<=dp[i-1][x][y])) que.pop();
						if(!que.empty())dp[i][x][y]=max(dp[i][x][y],dp[i-1][x][que.front()]+y-que.front());
						que.push(y);
					}else while(!que.empty())que.pop();
			}
		}
	}
	ll maxx=INT_MIN;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			maxx=max(maxx,dp[k][i][j]);
	cout<<maxx;
	return 0;
}
2024/11/26 16:48
加载中...