제출 #1138872

#제출 시각아이디문제언어결과실행 시간메모리
1138872mnbvcxz123Strah (COCI18_strah)C++20
110 / 110
126 ms55368 KiB
#include<bits/stdc++.h>
using namespace std;
using ll=long long;

constexpr int MAXN=2e3+5;

int n,m;
string s[MAXN];
int high[MAXN][MAXN];
int l[MAXN][MAXN],r[MAXN][MAXN];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin>>n>>m;
    for(int i=1;i<=n;++i){
        cin>>s[i];
        s[i]='#'+s[i]+'#';
        for(int j=1;j<=m;++j)
            high[i][j]=(s[i][j]=='.'?high[i-1][j]+1:0);
    }
    ll ans=0;
    for(int i=1;i<=n;++i){
        stack<int>S;
        for(int j=1;j<=m;++j){
            while(!S.empty() and high[i][S.top()]>=high[i][j])S.pop();
            l[i][j]=S.empty()?1:S.top()+1;
            S.push(j);
        }
        S=stack<int>();
        for(int j=m;j>=1;--j){
            while(!S.empty() and high[i][S.top()]>high[i][j])S.pop();
            r[i][j]=S.empty()?m:S.top()-1;
            S.push(j);
        }
        for(int j=1;j<=m;++j){
            ll x=j-l[i][j]+1;
            ll y=r[i][j]-j+1;
            ans+=1ll*high[i][j]*(high[i][j]+1ll)*x*y*(x+y)/4;
        }
    }
    cout<<ans<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...