传送门

好难的题。。至少对我来说。

这题就是模拟从最低的平台注水,然后将最低的填满以后从最低的平台向两边扩展,每次找最近的最低的平台h,然后将水填到h高度。 栈里存的是向外扩展的时候,有时会遇到高度递减的情况,这时并不能填水,但要把这些高度都递减(即扩展时的顺序)记录进栈,然后遇到一个比比水面高的平台h时,模拟倒水,水会挨个淹没最低的平台,即需要从栈顶一个一个出战计算淹没时间,直至栈顶平台高度>h,此时h入栈。重复执行就可算出答案。

#include <cstdio>
#include <iostream>
#define N 100011
#define INF 1000011
#define LL long long
#define min(x, y) ((x) < (y) ? (x) : (y)) int s[N];
int n, p = 1, top;
LL t, sum[N], h[N], w[N], add[N], ans[N]; inline LL read()
{
LL x = 0, f = 1;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
return x * f;
} int main()
{
int i, l, r;
n = read();
h[0] = h[n + 1] = INF;
for(i = 1; i <= n; i++)
{
sum[i] = sum[i - 1] + read();
h[i] = read();
if(h[p] > h[i]) p = i;
}
for(i = 1; i <= n + 1; i++)
{
while(top && h[s[top]] < h[i])
{
w[s[top]] = sum[i - 1] - sum[s[top - 1]];
add[s[top]] = w[s[top]] * (min(h[s[top - 1]], h[i]) - h[s[top]]);
top--;
}
s[++top] = i;
}
top = 0;
l = r = s[++top] = p;
for(i = 1; i <= n; i++)
{
if(h[l - 1] < h[r + 1]) p = --l;
else p = ++r;
while(top && h[s[top]] < h[p])
{
ans[s[top]] = t + w[s[top]];
t += add[s[top]];
top--;
}
s[++top] = p;
}
for(i = 1; i <= n; i++) printf("%lld\n", ans[i]);
return 0;
}

  

最新文章

  1. asp.net signalR 专题—— 第四篇 模拟RPC模式的Hub操作
  2. Mybatis 3.3.0 Log4j配置
  3. IT行业的正式入门
  4. 文件系统管理 之 Linux 创建文件系统及挂载文件系统流程详解
  5. css背景图片定位练习(一)
  6. Django 学习
  7. viewpager viewpager+fragment
  8. 对jQuery.isArray方法的分析
  9. android 获取设备唯一标识完美解决方案
  10. vi使用入门指南
  11. EffectiveC#9--明白几个相等运算之间的关系
  12. EasyUI - 操作 Tree 控件
  13. 从概念到业务来看 To B 和 To C 产品区别在哪?
  14. JAVA_SE基础——10.变量的作用域
  15. 不使用SpringBoot如何将原生Feign集成到Spring中来简化http调用
  16. 恢复oracle中误删除drop掉的表 闪回的方法
  17. CentOS7.2 1511部署RabbitMQ
  18. oracle学习创建和准备Oracle样例数据库
  19. torch随机数 manual_seed
  20. android -------- OkGo (让网络请求更简单的框架)

热门文章

  1. Windows系统下Android开发环境搭建
  2. svn亲笔操作
  3. TFS数据库分离附加经验总结
  4. hihoCode r#1077 : RMQ问题再临-线段树
  5. COGS 696. [IOI1996][USACO 2.3] 最长前缀
  6. Openjudge 2.5 6264:走出迷宫
  7. CPP-基础:非静态成员函数后面加const,以及mutable修饰成员变量
  8. shell脚本,提示用户输入一个用户名,如果存在;显示用户UID和SHELL信息;否则,则显示无此用户;显示完成之后,提示用户再次输入;如果是quit则退出;
  9. Life is short.,You need Python
  10. 三:MySql数据库及连接