This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <cmath>
#include <algorithm>
#include <utility>
#include<stack>
using namespace std;
#define pb push_back
#define mp make_pair
int h[2010],levo[2010],desno[2010];
char a[2010][2010];
long long dp[2010][2010];
int main()
{
int n,m;
long long res=0;
cin>>n>>m;
for(int i=0;i<m;i++) h[i]=n;
for( long long i=1;i<=n;i++ ) dp[i][1]=i*(i+1)/2;
for( long long i=1;i<=n;i++ ){
for( long long j=2;j<=m;j++ ) dp[i][j] = dp[i][j-1] + (long long)(( i*(i+1)*j*(j+1) )/4);
}
stack<int> s;
for(int i=0;i<n;i++ ){
for( int j=0;j<m;j++ )cin>>a[i][j];
}
for( int i=0;i<n;i++ ){
for( int j=0;j<m;j++ ){
// cin>>a[i][j];
if( a[i][j] == '#' ){
h[j]=n-i-1;
s.push(j);
continue;
}
if( s.empty() ){
levo[j]=-1;
s.push(j);
continue;
}
int curr=s.top();
// cout << " skaka " <<endl;
while( h[curr] > h[j] ){
s.pop();
if( s.empty() ) break;
else curr=s.top();
}
// cout<< " ee " <<endl;
if( s.empty() ) levo[j]=-1;
else levo[j] = curr;
s.push(j);
}
while( !s.empty() ) s.pop();
for( int j=m-1;j>=0;j-- ){
if( a[i][j] =='#' ){
// h[j]=n-i-1;
s.push(j);
continue;
}
if( s.empty() ) {
desno[j] = m;
s.push(j);
continue;
}
int curr=s.top();
while( h[curr] >= h[j] ){
s.pop();
if( s.empty() ) break;
else curr=s.top();
}
if( s.empty() ) desno[j] = m;
else desno[j] = curr;
s.push(j);
}
/* for( int j=0;j<m;j++ ){
cout << i << " " << j << " " << levo[j] << " " << desno[j] << " hehe " <<endl;
}*/
while( !s.empty() ) s.pop();
for( int j=0;j<m;j++ ){
if( a[i][j] == '#' ) continue;
// cout << i << " " << j << " " <<" " << h[j] << " "<<h[j]-( n-i-1 ) << " dosta " <<endl;
long long vis =(long long)( h[j]-( n-i-1 ) );
long long velka= (long long)(desno[j]-levo[j]-1);
long long mala1=(long long)(desno[j]-j-1);
long long mala2=(long long)(j-levo[j]-1);
// cout << i << " " << j << " " << " " << vis << " " << velka << " " << mala1 << " " << mala2 << " " << dp[vis][velka] << " rahib " <<endl;
res+=dp[vis][velka];
res-=dp[vis][mala1];
res-=dp[vis][mala2];
// cout << dp[1][2] << " bratee " <<endl;
}
}
cout<<res<<endl;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |