91分第十一个点WA,求调
查看原帖
91分第十一个点WA,求调
999366
fujiahao7700楼主2024/5/26 12:12

思路是把每一行以上矩阵转化为 刷广告/贴海报 问题,有l[i],r[i],代表第j列能向右向左的最大距离。

#include<bits/stdc++.h> 
using namespace std; 
#define int long long 
inline int read(){ 
  int x=0,f=1; 
  char c=getchar(); 
  while(c>57||c<48){ 
    if(c==45)f=-1; 
    c=getchar(); } 
  while(c<=57&&c>=48){ 
    x=(x<<1)+(x<<3)+(c^48); 
    c=getchar();
  }
  return x*f; 
} 
const int N=1e3+10; 
char o[N][N]; int n,m,f[N][N],ans,l[N],r[N],t,s[N]; 
void sta(int x){
  t=0; 
  for(int i=1;i<=m;i++){
    while(t&&f[x][s[t]]>=f[x][i])t--;//一直删到比他小 
    l[i]=s[t]+1;//左边界
    s[++t]=i;
  }
  t=0;s[0]=m+1; 
  for(int i=m;i>=1;i--){
    while(t&&f[x][s[t]]>=f[x][i])t--;//一直删到比他小 
    r[i]=s[t]-1;//右边界 
    s[++t]=i ; 
  }
  for(int i=1;i<=m;i++){
    ans=max(ans,(r[i]-l[i]+1)f[x][i]); } } 
signed main(){ 
  n=read();m=read();
  for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++){ 
      cin>>o[i][j];
      if(o[i][j]=='F')f[i][j]=f[i-1][j]+1;
      //相当于第j列包含o[i][j]的 最多有几个连续的F 
      else f[i][j]=0;//当然若是R则是0
      } 
  for(int i=1;i<=n;i++){//变成每一列的刷广告牌问题
    sta(i);
  } 
  printf("%lld",ans3); 
}
2024/5/26 12:12
加载中...