zoukankan      html  css  js  c++  java
  • 广东工业大学2016校赛决赛重现——E积木积水(方法据说很多)

    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;
    }
  • 相关阅读:
    探索c#之一致性Hash详解
    Redis系列(三)-Redis发布订阅及客户端编程
    Redis系列(二)-Hredis客户端设计及开源
    关于电脑操作一些高效的方法工具
    探索c#之递归APS和CPS
    探索C#之系列目录导航
    探索c#之不可变数据类型
    SOA相关资料整理分享
    探索c#之尾递归编译器优化
    探索c#之函数创建和闭包
  • 原文地址:https://www.cnblogs.com/Blackops/p/5384734.html
Copyright © 2011-2022 走看看