题意

Description

现有一堆边长为1的已经放置好的积木,小明(对的,你没看错,的确是陪伴我们成长的那个小明)想知道当下雨天来时会有多少积水。小明又是如此地喜欢二次元,于是他把这个三维的现实问题简化成二维的问题。设雨量无穷、积木不透水、积木间无缝连接,问在这个二次元的世界里,已放置好的积木会有多少单位的积水量? 

Input

第一行包含一个整数T(T≤100),表示接下来的测试样例个数。 每个测试样例有两行组成: 第一行包含一个整数N(N≤1e6),表示积木的列数; 第二行包含N个整数Ai(Ai≤1e6),表示第i列积木的个数。

Output

每个样例输出一行,包含一个整数,为题目所求。

Sample Input



11 

6 2 2 4 2 0 3 4 4 5 1

Sample Output

19

思路:

从两边开始找能够储存水的地方  从两边开始选择一个比较矮的,往中间找找到比自己高的,计算此时存的水量,然后依次循环。

#include <iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<stack>
#include<queue>
#include<vector>
#include<stdlib.h>
#include<map> using namespace std;
const int INF=(1<<31)-1;
typedef long long int LL;
LL a[1000010];
LL sum[1000010];
int main()
{
int n_case;
scanf("%d",&n_case);
while(n_case--)
{
LL n,i,j;
LL ans=0;
memset(a,0,sizeof(a));
scanf("%lld",&n);
a[0]=-1;
a[n+1]=-1;
sum[0]=0;
for(i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
sum[i]=a[i]+sum[i-1];// sum 表示从第一个开始到i 积木所占的体积;
}
LL left=1,right=n;
while(left<right) //往中间找, 找到比自己高的 计算体积 ,并且更新左右标记点,直到相遇
{
if(a[left] <= a[right]) //以矮的边开始找
{
for(i=left+1; i<=right; i++)
{
if(a[i]>=a[left]) break;
}
ans=ans+min(a[left],a[i])*(i-left-1)-(sum[i-1]-sum[left]); //计算此时体积
left=i;
}
else
{
for(i=right-1; i>=left; i--)
{
if(a[i]>=a[right]) break;
}
ans=ans+min(a[right],a[i])*(right-i-1)-(sum[right-1]-sum[i]);
right=i;
}
}
printf("%lld\n",ans);
}
return 0;
}

GDUT 积木积水 2*n 时间复杂度的更多相关文章

  1. Problem E: 积木积水 ——————【模拟】

    Problem E: 积木积水 Description 现有一堆边长为1的已经放置好的积木,小明(对的,你没看错,的确是陪伴我们成长的那个小明)想知道当下雨天来时会有多少积水.小明又是如此地喜欢二次元 ...

  2. 广东工业大学2016校赛决赛重现——E积木积水(方法据说很多)

    Problem E: 积木积水 Description 现有一堆边长为1的已经放置好的积木,小明(对的,你没看错,的确是陪伴我们成长的那个小明)想知道当下雨天来时会有多少积水.小明又是如此地喜欢二次元 ...

  3. ACM学习历程—广东工业大学2016校赛决赛-网络赛E 积木积水(最值问题 || 动态规划)

    题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1031&pid=4 这个题目自然会考虑到去讨论最长或者最短的板子. 笔上大概模拟一下的话,就 ...

  4. 2016广东工业大学校赛 E题 GDUT-oj1173

    Problem E: 积木积水 Description 现有一堆边长为1的已经放置好的积木,小明(对的,你没看错,的确是陪伴我们成长的那个小明)想知道当下雨天来时会有多少积水.小明又是如此地喜欢二次元 ...

  5. [BZOJ2650]积木

    [BZOJ2650]积木 题目大意: 有一排\(n\)个积木,第\(i\)个积木的高度为\(h_i\),定义混乱值为相邻两个积木高度之差的绝对值之和乘上系数\(c\).可以花费\(t^2\)的代价将一 ...

  6. LOJ2611. NOIP2013 积木大赛 【线段树】

    LOJ2611. NOIP2013 积木大赛 LINK 题目大意是给你一个目标状态数组 每次你可以选择一个连续区间加上一个值,求最小操作次数 我是神奇的脑子 最近做数据结构疯了 然后看见这题就数据结构 ...

  7. 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

    有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...

  8. codevs 3288 积木大赛

    题目描述 Description 春春幼儿园举办了一年一度的"积木大赛".今年比赛的内容是搭建一座宽度为 n 的大厦,大厦可以看成由 n 块宽度为1的积木组成,第i块积木的最终高度 ...

  9. 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)

    对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...

随机推荐

  1. python生成器及迭代器

    一.迭代器 迭代器是访问集合元素的一种方式 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 迭代器有两个基本的方法: ...

  2. android 活动

    一.Activity 声明周期 1 创建 把页面上的个元素加载到内存 onCreate 2 开始 把页面显示到屏幕 onStart 3 恢复 让页面在屏幕活动 onResume 4 暂停 停止页面动作 ...

  3. android控件-images

    1.imageButton 图片按钮 <ImageButton android:id="@+id/imageButton" android:layout_width=&quo ...

  4. MySQL的LOOP, LEAVE 和ITERATE语句(类似Continue、Break的写法)

    和REPEAT和while语句不同,LOOP.LEAVE.ITERATE更像其他编程语言中的goto语句. LOOP要设定一个label指定循环的开始位置,而LEAVE则像其他语言中的Break会离开 ...

  5. 阿里云***(java应用)

    阿里云***(FQ)实战 前言 ​ 因为公司涉及国外业务,依赖于google的map服务,生产环境我们使用的是亚马逊服务器,所以访问google地图没问题,但是国内的开发.测试环境,使用的是阿里云,想 ...

  6. Java生成读取条形码和二维码图片

    原文:http://www.open-open.com/code/view/1453520722495 package zxing; import com.google.zxing.BarcodeFo ...

  7. UVA 1482 - Playing With Stones(SG打表规律)

    UVA 1482 - Playing With Stones 题目链接 题意:给定n堆石头,每次选一堆取至少一个.不超过一半的石子,最后不能取的输,问是否先手必胜 思路:数值非常大.无法直接递推sg函 ...

  8. 高仿微信实现左滑显示删除button功能

    在实际项目中删除列表中的某一项是很常见的功能.传统的做法能够使用长按监听器等,而如今流行的做法是左滑弹出删除button,微信,QQ等都是这么做的,以下做一个演示样例,代码例如以下: 主页面MainA ...

  9. booth乘法器原理

    在微处理器芯片中,乘法器是进行数字信号处理的核心,同一时候也是微处理器中进行数据处理的wd=%E5%85%B3%E9%94%AE%E9%83%A8%E4%BB%B6&hl_tag=textli ...

  10. svn 创建分支、切换分支 及 合并分支 操作

    关联远程仓库: 右键  ---  点击 ' SVN Checkout...' 生成 打开trunk目录,在trunk目录下新建两个文本文件A.java,B.java: 打开A.java输入以下内容: ...