「Usaco2008 Jan」人工湖O(∩_∩)O 纯属的模拟+栈
题目描述
为了使湖看起来更加真实,约翰决定将湖的横截面建成N(1≤N≤105)个连续的平台高低错落的组合状,所有的平台从 左到右按1到N依次编号.当然咯,在湖中注入水后,这些平台都将被淹没.
平台i在设计图上用它的宽度wi(1≤Wi≤1000)和高度(你可以理解为该平台顶离约翰挖的地基的高度)Hi.(1≤Hi≤1000000)来描述的.
所有平台的高度都是独一无二的.湖的边缘可以视为无限高的平台.
下面给出了一张约翰的设计图:
按约翰的设想,在坑挖好后,他会以1单位每分钟的速度往最低的那个平台上注水.水在离开水管后立即下落,直到撞到平台顶或是更早些时候注入的水然后,与所有常温下的水一样,它会迅速地流动、扩散.简单起见,你可以认为这些都是在瞬间完成的.
下图展示了一个样例,样例数据即是本题的所给输入样例。
约翰想知道,对于每一个平台,它的顶部是从哪个时刻开始,与水面的距离至少为1单位长度.
注意:数据不保证答案全部在32位整型变量的范围内
输入
第2~N+1行:第i+1行为2个用空格隔开的整数Wi、Hi,描述了第i个平台.
输出
第1~N行: 第i行为1个整数,表示平台i的顶到水面的距离从何时开始大于1 单位长度。
样例输入 Copy
3
4 2
2 7
6 4
样例输出 Copy
4
50
26
解题过程:
- 这题的主要算法就是栈,不得不说用栈搞模拟还挺神奇的。。。
- 这题就是模拟从最低的平台注水,然后将最低的填满以后从最低的平台向两边扩展。
- 每次找最近的最低的平台h,然后将水填到h高度。
- 栈里存的是向外扩展的时候,有时会遇到高度递减的情况,这时并不能填水,但要把这些高度都递减(即扩展时的顺序)记录进栈。
- 然后遇到一个比水面高的平台h时,模拟倒水,水会挨个淹没最低的平台,即需要从栈顶一个一个出栈计算淹没时间,直至栈顶平台高度>h,此时h入栈。重复执行就可算出答案。
然后就是代码,感觉模拟这个东西就是考码力和思维强度的。。。。
// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
const int inf=<<;
long long top;
struct Pool
{
long long w;
long long h;
long long id;
Pool(long long ww=,long long hh=, long long _id=):w(ww),h(hh),id(_id){};
}pool[maxn],struck[maxn];
long long n,m;
long long ans[maxn];
long long now;
inline long long read(){
register long long x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return (f==)?x:-x;
}
int main()
{
long long temp=inf,id;
n=read();
for(int i=;i<=n;i++)
{
pool[i].w=read();
pool[i].h=read();
pool[i].id=i;
if(temp>pool[i].h)
{
temp=pool[i].h;
id=i;
}
}
struck[++top]=pool[id];
struck[].h=inf;
long long l=id;
long long r=id;
long long p;
pool[].h=pool[n+].h=inf;
for(int i=;i<=n;i++)
{
long long add=;
if(pool[l-].h<pool[r+].h)
{
p=--l;
}
else
{
p=++r;
}
while(pool[p].h>struck[top].h&&top)
{
struck[top].w+=add;
ans[struck[top].id]=now+struck[top].w;
now+=struck[top].w*(min(pool[p].h,struck[top-].h)-struck[top].h);
add=struck[top].w;
top--;
}
pool[p].w+=add;
struck[++top]=pool[p];
}
for(int i=;i<=n;i++)
{
printf("%lld\n",ans[i]);
}
return ;
}
总结一下:
在想到某些思路时要敢于打,模拟可以用各种各样的方式去优化,然后注意一下一些细节就可以了。
「Usaco2008 Jan」人工湖O(∩_∩)O 纯属的模拟+栈的更多相关文章
- 「BZOJ 5188」「Usaco2018 Jan」MooTube
题目链接 luogu bzoj \(Describe\) 有一个\(n\)个节点的树,边有权值,定义两个节点之间的距离为两点之间的路径上的最小边权 给你\(Q\)个询问,问你与点\(v\)的距离大于等 ...
- 「BZOJ4510」「Usaco2016 Jan」Radio Contact 解题报告
无线电联系 Radio Contact 题目描述 Farmer John has lost his favorite cow bell, and Bessie the cow has agreed t ...
- 「学习笔记」Min25筛
「学习笔记」Min25筛 前言 周指导今天模拟赛五分钟秒第一题,十分钟说第二题是 \(\text{Min25}\) 筛板子题,要不是第三题出题人数据范围给错了,周指导十五分钟就 \(\text{AK ...
- LOJ#3083.「GXOI / GZOI2019」与或和_单调栈_拆位
#3083. 「GXOI / GZOI2019」与或和 题目大意 给定一个\(N\times N\)的矩阵,求所有子矩阵的\(AND(\&)\)之和.\(OR(|)\)之和. 数据范围 \(1 ...
- [bzoj1613][Usaco2008 Jan]Running贝茜的晨练计划_动态规划
Running贝茜的晨练计划 bzoj-1613 Usaco-2008 Jan 题目大意:题目链接(U组题题意真的是没法概括qwq....). 注释:略. 想法:一眼dp题. 状态:dp[i][j]表 ...
- 「C语言」常量和变量的表示、应用和变量命名规则
在程序运行中,其值不能改变的量成为常量. 在基本数据类型中,常量可分为整型常量.实型常量.符号常量和字符型常量(包括字符常量和字符串常量),现分别介绍如下: 目录: 一.常量 二.C语言标识符 三.变 ...
- 「AHOI2014/JSOI2014」宅男计划
「AHOI2014/JSOI2014」宅男计划 传送门 我们首先要发现一个性质:存货天数随买食物的次数的变化类似于单峰函数. 具体证明不会啊,好像是二分加三分来证明?但是没有找到明确的严格证明. 感性 ...
- 「AHOI2014/JSOI2014」拼图
「AHOI2014/JSOI2014」拼图 传送门 看到 \(n \times m \le 10^5\) ,考虑根号分治. 对于 \(n < m\) 的情况,我们可以枚举最终矩形的上下边界 \( ...
- 「AHOI2014/JSOI2014」奇怪的计算器
「AHOI2014/JSOI2014」奇怪的计算器 传送门 我拿到这题首先是懵b的,因为感觉没有任何性质... 后来经过同机房dalao的指导发现可以把所有的 \(X\) 放到一起排序,然后我们可以发 ...
随机推荐
- Git学习记录-基本命令篇
目录 网页在线练习地址 https://learngitbranching.js.org/ 1.git commit Git 仓库中的提交记录保存的是你的目录下所有文件的快照,就像是把整个目录复制,然 ...
- PCA 算法核心:高维度向量向低维度投影
Principal Component Analysis:主成分分析 步骤 5 步: 1.去平均值,也就是将向量中每一项都减去各自向量的平均值 2.计算矩阵的方差,协方差,特征值, 3,.把特征值从大 ...
- springboot 自定义LocaleResolver切换语言
springboot 自定义LocaleResolver切换语言 我们在做项目的时候,往往有很多项目需要根据用户的需要来切换不同的语言,使用国际化就可以轻松解决. 我们可以自定义springboor中 ...
- Redis实现分布式文件夹锁
缘起 最近做一个项目,类似某度云盘,另外附加定制功能,本人负责云盘相关功能实现,这个项目跟云盘不同的是,以项目为分配权限的单位,同一个项目及子目录所有有权限的用户可以同时操作所有文件,这样就很容易出现 ...
- cocos2d-x 3.2锚点,Point,addchild,getcontensize
一,锚点 打个比方.在墙挂一幅画时,要钉一个钉子,那个钉子就是锚点. 然后挂图时,钉子(锚点)放在要订的位置(position),订下去.完成(贴图结束). 贴图的基本点,锚点默认为(0.5,0.5) ...
- springboot依赖的一些配置:spring-boot-dependencies、spring-boot-starter-parent、io.spring.platform
springboot里会引入很多springboot starter依赖,这些依赖的版本号统一管理,springboot有几种方案可以选择. 一.spring-boot-dependencies 有两 ...
- php 安装vld扩展
下载地址 : http://pecl.php.net/package/vld 此处包是 : vld-0.14.0.tgz 1. tar -xvf vld-0.14.0.tgz -C INSTAL ...
- ARM64架构下,OpenJDK的官方Docker镜像为何没有8版本
为什么需要ARM64架构的OpenJDK8的Docker镜像 对现有的Java应用,之前一直运行在x86处理器环境下,编译和运行都是JDK8,如今在树莓派的Docker环境运行(也可能是其他ARM环境 ...
- Cocos2d-x 学习笔记(11.2) RotateBy RotateTo
1. RotateBy RotateTo 两个旋转方法.RotateBy是在当前角度上旋转设置的角度.RotateTo是直接旋转到设置的角度,方向遵循“就近原则”.两者没有相互继承关系. 1.1 成员 ...
- 《Java并发编程实战》读书笔记-第4章 对象的组合
设计线程安全的类 三个基本要素: 找出构成对象状态的所有变量 找出约束状态变量的不变性条件 建立对象状态的并发访问管理策略 实例封闭 将数据封装在对象内部,可以将数据的访问限制在对象的方法上,从而更容 ...