广东工业大学2016校赛----积木积水【模拟】
2016-04-11 09:56
337 查看
Problem E: 积木积水
Description
现有一堆边长为1的已经放置好的积木,小明(对的,你没看错,的确是陪伴我们成长的那个小明)想知道当下雨天来时会有多少积水。小明又是如此地喜欢二次元,于是他把这个三维的现实问题简化成二维的问题。设雨量无穷、积木不透水、积木间无缝连接,问在这个二次元的世界里,已放置好的积木会有多少单位的积水量?
Input
第一行包含一个整数T(T≤100),表示接下来的测试样例个数。 每个测试样例有两行组成: 第一行包含一个整数N(N≤1e6),表示积木的列数; 第二行包含N个整数Ai(Ai≤1e6),表示第i列积木的个数。
Output
每个样例输出一行,包含一个整数,为题目所求。
Sample Input
111
6 2 2 4 2 0 3 4 4 5 1
Sample Output
19HINT
比赛时没做出来,后来看别人的题解,思路比我的要好,值得学习,积木类的题目也该多练练
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MN=1e6+10;
int min(int x,int y)
{
if(x<y) return x;
else return y;
}
int a[MN];
struct node
{
int v,id;
} b[MN];
int main()
{
int t,n,i;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1; i<=n; i++)
scanf("%d",&a[i]);
int t;
t=1;
while(a[t+1]>=a[t]&&t<n) t++;//全部递增
if(t==n)
{
printf("0\n");
continue;
}
t=1;
while(a[t+1]<=a[t]&&t<n)t++;//全部递减
if(t==n)
{
printf("0\n");
continue;
}
t=1;
while(a[t+1]>=a[t]&&t<n) t++;//先走过递增的不分
int cnt=0;
b[++cnt].v=a[t];
b[cnt].id=t;
b[++cnt].v=a[t+1];
b[cnt].id=t+1;
long long ans=0;
for( i=t+2; i<=n; i++)
{
if(a[i]<=b[cnt].v)//如果不大于,就存入,这样存进去的是非递增的
{
b[++cnt].v=a[i];
b[cnt].id=i;
}
else//如果发现比前一个大,马上算这部分的积水
{
while(a[i]>b[cnt].v&&cnt>1)
{
int mm=min(a[i],b[cnt-1].v)-b[cnt].v;
int ll=i-b[cnt-1].id-1;
ans+=(long long )mm*ll;
cnt--;
}
if(cnt==1&&a[i]>b[cnt].v) cnt--;//选取大的那个为边
b[++cnt].v=a[i];
b[cnt].id=i;
}
}
printf("%lld\n",ans);
}
}
相关文章推荐
- json文本
- kafka源码解析之十二KafkaController(下篇)
- SparkML之假设性检验(二)分布拟合检验
- VC界面绘制双缓存
- js中string的常见操作
- PHP读取mssql json数据中文乱码的解决办法
- C# TCP实现多个客户端与服务端 数据 与 文件的传输
- 减小游戏apk安装包大小
- Redis简单实例
- scrapy中运行爬虫时出现twisted critical unhandled error错误
- MapReduce应用案例--简单的数据去重
- 冒泡排序
- 52、private static final long serialVersionUID的作用
- Pixhawk之启动代码和入口函数(.mk、rcS、__start、hrt)
- Android Studio设置字体 编码格式
- WKWebView新特性及JS交互
- 百度地图3.7.1添加覆盖物
- 谈KVC、KVO(重点观察者模式)机制编程
- Linun top命令详解
- 分类模型的性能评估——以SAS Logistic回归为例(3): Lift和Gain