求助,10分
查看原帖
求助,10分
1183074
xzy_AK_IOI楼主2025/1/22 21:33
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define F(i,k,n) for (int i=k;i<=n;i++)
const int N=2e2+10;
char mp[N][N];
int dp[N][N][N];
int t[N],p[N];
int n,m,x,y,k,ans=0,a,b;
deque<int>dq;
signed main(){
	memset(dp,-0x3f,sizeof dp);
	cin>>n>>m>>x>>y>>k;
	dp[x][y][0]=0;
	F(i,1,n) F(j,1,m) cin>>mp[i][j];
	F(i,1,k) cin>>a>>b>>p[i],t[i]=b-a+1;
	F(now,1,k){
		if (p[now]==1){
			F(i,1,m){
				dq.clear();
				for (int j=n;j>=1;j--){
					if (mp[j][i]=='x'){
						dq.clear();
						continue;
					}
					while (dq.size() && dp[j][i][now-1]>=
					dp[dq.front()][i][now-1]+(abs(dq.front()-j)))
					 dq.pop_front();
					dq.push_front(j);
					while (dq.size() && abs(j-dq.back())>t[k])
					 dq.pop_back();
					dp[j][i][now]=dp[dq.back()][i][now-1]+abs(dq.back()-j);
					ans=max(ans,dp[j][i][now]);
				}
			}
		}
		else if (p[now]==2){
			F(i,1,m){
				dq.clear();
				F(j,1,n){ 
					if (mp[j][i]=='x'){
						dq.clear();
						continue;
					}
					while (dq.size() && dp[j][i][now-1]>=
					dp[dq.front()][i][now-1]+(abs(dq.front()-j)))
					 dq.pop_front();
					dq.push_front(j);
					while (dq.size() && abs(j-dq.back())>t[k])
					 dq.pop_back();
					dp[j][i][now]=dp[dq.back()][i][now-1]+abs(dq.back()-j);
					ans=max(ans,dp[j][i][now]);
				}
			}
		}
		else if (p[now]==3){
			F(i,1,n){
				dq.clear();
				for (int j=m;j>=1;j--){
					if (mp[i][j]=='x'){
						dq.clear();
						continue;
					}
					while (dq.size() && dp[i][j][now-1]>=
					dp[i][dq.front()][now-1]+(abs(dq.front()-j)))
					 dq.pop_front();
					dq.push_front(j);
					while (dq.size() && abs(j-dq.back())>t[k])
					 dq.pop_back();
					dp[i][j][now]=dp[i][dq.back()][now-1]+abs(dq.back()-j);
					ans=max(ans,dp[i][j][now]);
				}
			}
		}
		else{
			F(i,1,n){
				dq.clear();
				F(j,1,m){
					if (mp[i][j]=='x'){
						dq.clear();
						continue;
					}
					while (dq.size() && dp[i][j][now-1]>=
					dp[i][dq.front()][now-1]+(abs(dq.front()-j)))
					 dq.pop_front();
					dq.push_front(j);
					while (dq.size() && abs(j-dq.back())>t[k])
					 dq.pop_back();
					dp[i][j][now]=dp[i][dq.back()][now-1]+abs(dq.back()-j);
					ans=max(ans,dp[i][j][now]);
				}
			}
		}
	}
	cout<<ans;
	return 0;
}
2025/1/22 21:33
加载中...