50pts燃尽无法调出,玄关
查看原帖
50pts燃尽无法调出,玄关
877768
wmx111楼主2025/8/1 21:12

rt

#include<bits/stdc++.h>
using namespace std;
const int N=405;
int n,m,x,y,kk,res,f[N][N][N],tail,head;
struct node{
	int val,idx;
}q[N];
char mp[N][N];
int nyt[5]={0,0,0,-1,1},nxt[5]={0,-1,1,0,0};
int main(){
	cin>>n>>m>>x>>y>>kk;
	for(int i=1;i<=n;i++){
		scanf("%s",mp[i]+1);
	}
	memset(f,0xcf,sizeof(f));
	f[0][x][y]=0;
	for(int k=1;k<=kk;k++){
		head=1;tail=0;
		int s,t,d;
		cin>>s>>t>>d;
		int end=(d<=2?m:n);
		int len=t-s+1; 
		for(int i=1;i<=end;i++){
			int nx,ny;
			switch(d){
				case 1:
					nx=n;
					ny=i;
					break;
				case 2:
					nx=1;
					ny=i;
					break;
				case 3:
					nx=i;
					ny=m;
					break;
				case 4:
					nx=i;
					ny=1;
					break;
			}
			for(int step=1;nx<=n&&nx>0&&ny<=m&&ny>0;step++,nx+=nxt[d],ny+=nyt[d]){
				if(mp[nx][ny]=='x'){
					tail=0;
					head=1;
				}
				else{
					while(head<=tail&&f[k-1][nx][ny]-step>=q[tail].val-q[tail].idx)tail--;
					q[++tail]={f[k-1][nx][ny],step};
					if(q[tail].idx-q[head].idx>len)head++;
					int v=q[head].val,j=q[head].idx;
					f[k][nx][ny]=v+step-j;
					res=max(res,f[k][nx][ny]);
				}
			}			
		}
	}
	cout<<res<<endl;
	return 0;
}
2025/8/1 21:12
加载中...