洛谷 P4147 玉蟾宫

mac2025-04-28  5

这好像是一道悬线法的题目,但是我不会,只能用单调栈水过了

我们将 a i , j a_{i,j} ai,j定义为从 ( i , j ) (i,j) (i,j)出发向上(坐标减小)可以达到的最长的、没有R的路径

比如说样例

5 6 R F F F F F F F F F F F R R R F F F F F F F F F F F F F F F

中的 a a a数组对应如下:

0 1 1 1 1 1 1 2 2 2 2 2 0 0 0 3 3 3 1 1 1 4 4 4 2 2 2 5 5 5

然后一行一行枚举,把每一行的 a a a往这道题上套 完毕。

#include<cstdio> #include<cctype> #include<stack> #include<algorithm> using namespace std; int a[1100][1100]; struct rect { int h,w; }; int main() { int n,m;scanf("%d%d",&n,&m); char c; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { while(isspace(c=getchar())); a[i][j]=c=='R'?0:a[i-1][j]+1; } m++; int ans=0; for(int i=1;i<=n;i++) { stack<rect>q; int w; for(int j=1;j<=m;j++) { w=0; while(q.size()&&q.top().h>a[i][j])ans=max(ans,q.top().h*(w+=q.top().w)),q.pop(); q.push((rect){a[i][j],w+1}); } } printf("%d",3*ans); return 0; }
最新回复(0)