[BZOJ1595] [Usaco2008 Jan]人工湖(单调栈)
2024-08-30 11:43:31
好难的题。。至少对我来说。
这题就是模拟从最低的平台注水,然后将最低的填满以后从最低的平台向两边扩展,每次找最近的最低的平台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;
}
最新文章
- asp.net signalR 专题—— 第四篇 模拟RPC模式的Hub操作
- Mybatis 3.3.0 Log4j配置
- IT行业的正式入门
- 文件系统管理 之 Linux 创建文件系统及挂载文件系统流程详解
- css背景图片定位练习(一)
- Django 学习
- viewpager viewpager+fragment
- 对jQuery.isArray方法的分析
- android 获取设备唯一标识完美解决方案
- vi使用入门指南
- EffectiveC#9--明白几个相等运算之间的关系
- EasyUI - 操作 Tree 控件
- 从概念到业务来看 To B 和 To C 产品区别在哪?
- JAVA_SE基础——10.变量的作用域
- 不使用SpringBoot如何将原生Feign集成到Spring中来简化http调用
- 恢复oracle中误删除drop掉的表 闪回的方法
- CentOS7.2 1511部署RabbitMQ
- oracle学习创建和准备Oracle样例数据库
- torch随机数 manual_seed
- android -------- OkGo (让网络请求更简单的框架)
热门文章
- Windows系统下Android开发环境搭建
- svn亲笔操作
- TFS数据库分离附加经验总结
- hihoCode r#1077 : RMQ问题再临-线段树
- COGS 696. [IOI1996][USACO 2.3] 最长前缀
- Openjudge 2.5 6264:走出迷宫
- CPP-基础:非静态成员函数后面加const,以及mutable修饰成员变量
- shell脚本,提示用户输入一个用户名,如果存在;显示用户UID和SHELL信息;否则,则显示无此用户;显示完成之后,提示用户再次输入;如果是quit则退出;
- Life is short.,You need Python
- 三:MySql数据库及连接