#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define f1 first
#define s2 second
#define pb push_back
#define mp make_pair
#define ll long long
#define fri(a) freopen(a,"r",stdin);
#define fro(a) freopen(a,"w",stdout);
const int N=2e3+5;
int n,m,hist[N],seg[4*N];
char grid[N][N];
ll dpf(ll i,ll j){
//cout<<"i = "<<i<<" j = "<<j<<endl;
return ((i+1)*(j+1)*i*j)/4;
}
void build(int v,int tl,int tr){
if(tl == tr){
seg[v] = tl;
}
else{
int tm = (tl+tr)/2;
build(v*2,tl,tm);
build(v*2+1,tm+1,tr);
seg[v]=(hist[seg[v*2]] < hist[seg[v*2+1]] ? seg[v*2] : seg[v*2+1]);
}
}
ll query(int v,int tl,int tr,int l,int r){
if(l > r)return -1;
if(l==tl && r==tr)return seg[v];
else{
int tm = (tl+tr)/2;
ll left = query(v*2,tl,tm,l,min(r,tm));
ll right = query(v*2+1,tm+1,tr,max(l,tm+1),r);
if(left == -1)return right;
if(right == -1)return left;
return hist[left] < hist[right] ? left : right;
}
}
ll solve1(int i,int j){
if(i==j)return dpf(1,hist[query(1,1,m,i,j)]);
if(i>j)return 0;
int k=query(1,1,m,i,j);
//cout<<i<<" "<<j<<" "<<k<<endl;
ll ans=dpf(hist[k],j-i+1);
return ans+=solve1(i,k)+solve1(k+2,j);
}
ll solve(){
ll ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(grid[i][j]=='#'){
hist[j]=0;
}
else hist[j]++;
}
memset(seg,-1,sizeof(seg));
build(1,0,m-1);
ans+=solve1(1,m);
//cout<<ans<<endl;
}
return ans;
}
int main(){
//fri("in.txt");
//fro("out.txt");
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>grid[i][j];
}
}
cout<<solve()<<endl;
return 0;
}
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
2 ms |
376 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
2 ms |
376 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
15 ms |
1016 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
15 ms |
1100 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
12 ms |
1144 KB |
Output is correct |
2 |
Incorrect |
15 ms |
1016 KB |
Output isn't correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
170 ms |
3116 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
414 ms |
5472 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
283 ms |
3576 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
38 ms |
4216 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
674 ms |
8312 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |