洛谷 P1318 积水面积
P1318 积水面积
将每层可积水的面积加起来
每层可积水的面积=左边第一个比他大右边的所有空位+右边第一个比他大的左边的所有空位-这一层的所有空位(他指当前高度
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define maxn 1000000 4 5 int n,h[maxn],tot,maxx; 6 int l[maxn],r[maxn],ans; 7 bool if_; 8 char ch; 9 inline void read(int &now) 10 { 11 ch=getchar(); now=0; 12 while(ch>'9'||ch<'0') ch=getchar(); 13 while(ch>='0'&&ch<='9') now=now*10+ch-'0',ch=getchar(); 14 } 15 16 int main() 17 { 18 read(n); 19 for(int i=1;i<=n;i++) read(h[i]),maxx=max(maxx,h[i]); 20 for(int k=maxx;k>=1;k--) 21 { 22 int s=0; 23 if_=false; 24 for(int i=1;i<=n;i++) 25 { 26 if(if_==false) 27 { 28 if(h[i]>=k) if_=true; 29 else if(h[i]<k) s--; 30 } 31 } 32 if_=false; 33 for(int i=n;i>=1;i--) 34 { 35 if(if_==false) 36 { 37 if(h[i]>=k) if_=true; 38 else if(h[i]<k) s--; 39 } 40 } 41 for(int i=1;i<=n;i++) 42 if(h[i]<k) s++; 43 ans+=s; 44 } 45 printf("%d\n",ans); 46 return 0; 47 }