Problem E: 积木积水
Description
现有一堆边长为1的已经放置好的积木,小明(对的,你没看错,的确是陪伴我们成长的那个小明)想知道当下雨天来时会有多少积水。小明又是如此地喜欢二次元,于是他把这个三维的现实问题简化成二维的问题。设雨量无穷、积木不透水、积木间无缝连接,问在这个二次元的世界里,已放置好的积木会有多少单位的积水量?
Input
第一行包含一个整数T(T≤100),表示接下来的测试样例个数。 每个测试样例有两行组成: 第一行包含一个整数N(N≤1e6),表示积木的列数; 第二行包含N个整数Ai(Ai≤1e6),表示第i列积木的个数。
Output
每个样例输出一行,包含一个整数,为题目所求。
Sample Input
1 11 6 2 2 4 2 0 3 4 4 5 1
Sample Output
19
按照聚聚的方法(理解估计有问题,复杂度应该比他的更高...)刚开始TLE几次,用输入外挂也TLE,把同步关了却1984MS险过.....本渣以后再也不敢用输入外挂了。有空想想其他方法做吧。
代码:
#include<iostream> #include<algorithm> #include<cstdlib> #include<sstream> #include<cstring> #include<cstdio> #include<string> #include<deque> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; int r[1000010]; int high[1000010]; int l[1000010]; int main (void) { ios::sync_with_stdio(false); int n,i,j,T; cin>>T; while (T--) { cin>>n; int maxm=-1; for (i=1; i<=n; i++) { cin>>high[i]; l[i]=max(l[i-1],high[i]);//从前到后高度更新 } for (i=n; i>=1; i--) { r[i]=max(high[i],r[i+1]);//从后往前高度更新 } long long ans=0;// for (i=1; i<=n; i++) { ans=ans+min(r[i],l[i])-high[i]; } cout<<ans<<endl; memset(r,0,sizeof(r)); memset(l,0,sizeof(l)); memset(high,0,sizeof(high)); } return 0; }