10pts,不是我错哪了?数组开够了,long long也开了
  • 板块P1950 长方形
  • 楼主UKE_bound
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/8/2 17:25
  • 上次更新2025/8/2 17:44:52
查看原帖
10pts,不是我错哪了?数组开够了,long long也开了
1073741
UKE_bound楼主2025/8/2 17:25

思路:仿照玉蟾宫,处理出 h 数组和 l 数组,然后对于每个非障碍格统计其作为右下角出现的次数。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1005;
char a[maxn][maxn];
int n,m;
int h[maxn][maxn],l[maxn][maxn];
inline char getc(){
	char c=getchar();
	while(c!='.'&&c!='*')c=getchar();
	return c;
}
signed main(){
	cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            a[i][j]=getc();
        }
    }
    /*for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cout<<a[i][j];
        }
        cout<<"\n";
    }*/
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]=='*'){
                h[i][j]=0;
            }else{
                h[i][j]=h[i-1][j]+1;
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]=='.'){
                l[i][j]=(a[i][j-1]=='.'?l[i][j-1]:j);
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]=='.'){
                if(a[i-1][j]=='.'){
                    l[i][j]=max(l[i][j],l[i-1][j]);
                }
            }
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]=='.'){
                ans+=(j-l[i][j]+1)*h[i][j];
            }
        }
    }
    cout<<ans;
    return 0;
}
2025/8/2 17:25
加载中...