80pts求助
查看原帖
80pts求助
800499
suzhikz楼主2024/9/29 21:35
#include<bits/stdc++.h>
#define ll long long
#define reg register
#define db double
#define il inline
using namespace std;
void read(int &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
void read(ll &x){x=0;int f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=f;}
const int N=205; 
int n,m,x,y,k;
int dp[N][N];
int l[N][N];
int la[N][N];
char c[N][N];
int tx[6]={0,-1,1,0,0},ty[6]={0,0,0,-1,1};
int d;
void work(int x,int y,int f){
	deque<pair<int,int> >q;
	while(x<=n&&x>=1&&y<=m&&y>=1){
//		cout<<x<<' '<<y<<endl;
		if(c[x][y]=='x')q.clear();
		if(!q.empty()){
//			cout<<"a";
			while(!q.empty()&&abs(x-q.front().first+y-q.front().second)>d){
				q.pop_front();
			}
			if(!q.empty()){
				int tmpx=q.front().first,tmpy=q.front().second;
				dp[x][y]=max(dp[x][y],l[tmpx][tmpy]+abs(x-tmpx+y-tmpy));
				while(!q.empty()&&l[x][y]>=(l[q.front().first][q.front().second]+abs(x+y-q.front().second-q.front().first))){
					q.pop_back();
				}
			}
		}
		if(c[x][y]!='x')q.push_back(make_pair(x,y));
		x+=tx[f];y+=ty[f];
	}
}
int main(){
	read(n);read(m);read(x);read(y);read(k);
	for(int i=1;i<=n;i++){
		scanf("%s",c[i]+1);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++)
		dp[i][j]=-998244353;
	}
	dp[x][y]=0;
	for(int lll,r,f,i=1;i<=k;i++){
		read(lll);read(r);read(f);
		d=r-lll+1;
		for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)l[i][j]=dp[i][j];
		if(f==1){
			for(int i=1;i<=m;i++)work(n,i,f);
		}else if(f==2){
			for(int i=1;i<=m;i++)work(1,i,f);
		}else if(f==3){
			for(int i=1;i<=n;i++)work(i,m,f);
		}else{
			for(int i=1;i<=n;i++)work(i,1,f);
		}
	
	}
	int maxx=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			maxx=max(maxx,dp[i][j]);
		}
	}
	cout<<maxx<<endl;
//	cout<<maxx;
	return 0;
}

2024/9/29 21:35
加载中...