rt 单调队列优化dp,全WA,求调
感谢各位大佬
#include <bits/stdc++.h>
using namespace std;
//#define int long long
const int N=210,M=210,inf=1e9;
int n,m,K,x,y;
int mp[N][N];
struct Line{
int l,r,f;
};
Line l[N];
int dp[M][N][N];
struct node{
int v,p;
};
deque <node>q;
char s[N];
signed main(){
//freopen("in.txt","r",stdin);
cin>>n>>m>>x>>y>>K;
for(int i=1;i<=n;i++){
cin>>s+1;
for(int j=1;j<=m;j++){
mp[i][j]=(s[j]=='.'?0:1);
}
}
for(int i=1;i<=K;i++){
cin>>l[i].l>>l[i].r>>l[i].f;
}
int ans=0;
for(int i=0;i<=K;i++) for(int j=1;j<=n;j++) for(int k=1;k<=m;k++) dp[i][j][k]=-inf;
dp[0][x][y]=0;
for(int i=1;i<=K;i++){
int cd=l[i].r-l[i].l+1;
if(l[i].f==4){
for(int j=1;j<=n;j++){
q.clear();
for(int k=1;k<=m;k++){
while(!q.empty() and q.front().p<k-cd) q.pop_front();
if(mp[j][k]==1){
q.clear();
continue;
}
while(!q.empty() and q.back().v+k-q.back().p<=dp[i-1][j][k]) q.pop_back();
q.push_back({dp[i-1][j][k],k});
dp[i][j][k]=max(dp[i][j][k],q.front().v+k-q.front().p);
}
}
}
if(l[i].f==3){
for(int j=1;j<=n;j++){
q.clear();
for(int k=m;k>=1;k--){
while(!q.empty() and q.front().p>k+cd) q.pop_front();
if(mp[j][k]==1){
q.clear();
continue;
}
while(!q.empty() and q.back().v+q.back().p-k<=dp[i-1][j][k]) q.pop_back();
q.push_back({dp[i-1][j][k],k});
dp[i][j][k]=max(dp[i][j][k],q.front().v+q.front().p-k);
}
}
}
if(l[i].f==1){
for(int k=1;k<=m;k++){
q.clear();
for(int j=n;j>=1;j--){
while(!q.empty() and q.front().p>j+cd) q.pop_front();
if(mp[j][k]==1){
q.clear();
continue;
}
while(!q.empty() and q.back().v+q.back().p-j<=dp[i-1][j][k]) q.pop_back();
q.push_back({dp[i-1][j][k],j});
dp[i][j][k]=max(dp[i][j][k],q.front().v+q.front().p-j);
}
}
}
if(l[i].f==2){
for(int k=1;k<=m;k++){
q.clear();
for(int j=1;j<=n;j++){
while(!q.empty() and q.front().p>j-cd) q.pop_front();
if(mp[j][k]==1){
q.clear();
continue;
}
while(!q.empty() and q.back().v-q.back().p+j<=dp[i-1][j][k]) q.pop_back();
q.push_back({dp[i-1][j][k],j});
dp[i][j][k]=max(dp[i][j][k],q.front().v-q.front().p+j);
}
}
}
}
for(int i=0;i<=K;i++) for(int j=1;j<=n;j++) for(int k=1;k<=m;k++) ans=max(ans,dp[i][j][k]);
cout<<ans<<endl;
return 0;
}