题目描述

夏日那让人喘不过气的酷热将奶牛们的烦躁情绪推到了最高点.最终,约翰决定建一个人工湖供奶牛消暑之用. 
为了使湖看起来更加真实,约翰决定将湖的横截面建成N(1≤N≤105)个连续的平台高低错落的组合状,所有的平台从 左到右按1到N依次编号.当然咯,在湖中注入水后,这些平台都将被淹没.  
 平台i在设计图上用它的宽度wi(1≤Wi≤1000)和高度(你可以理解为该平台顶离约翰挖的地基的高度)Hi.(1≤Hi≤1000000)来描述的. 
所有平台的高度都是独一无二的.湖的边缘可以视为无限高的平台. 
下面给出了一张约翰的设计图:  
 
按约翰的设想,在坑挖好后,他会以1单位每分钟的速度往最低的那个平台上注水.水在离开水管后立即下落,直到撞到平台顶或是更早些时候注入的水然后,与所有常温下的水一样,它会迅速地流动、扩散.简单起见,你可以认为这些都是在瞬间完成的. 
下图展示了一个样例,样例数据即是本题的所给输入样例。 

约翰想知道,对于每一个平台,它的顶部是从哪个时刻开始,与水面的距离至少为1单位长度. 
注意:数据不保证答案全部在32位整型变量的范围内 

输入

第1行:1个整数,N ; 
第2~N+1行:第i+1行为2个用空格隔开的整数Wi、Hi,描述了第i个平台. 

输出

输出N行。  
第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 纯属的模拟+栈的更多相关文章

  1. 「BZOJ 5188」「Usaco2018 Jan」MooTube

    题目链接 luogu bzoj \(Describe\) 有一个\(n\)个节点的树,边有权值,定义两个节点之间的距离为两点之间的路径上的最小边权 给你\(Q\)个询问,问你与点\(v\)的距离大于等 ...

  2. 「BZOJ4510」「Usaco2016 Jan」Radio Contact 解题报告

    无线电联系 Radio Contact 题目描述 Farmer John has lost his favorite cow bell, and Bessie the cow has agreed t ...

  3. 「学习笔记」Min25筛

    「学习笔记」Min25筛 前言 周指导今天模拟赛五分钟秒第一题,十分钟说第二题是 \(\text{Min25}​\) 筛板子题,要不是第三题出题人数据范围给错了,周指导十五分钟就 \(\text{AK ...

  4. LOJ#3083.「GXOI / GZOI2019」与或和_单调栈_拆位

    #3083. 「GXOI / GZOI2019」与或和 题目大意 给定一个\(N\times N\)的矩阵,求所有子矩阵的\(AND(\&)\)之和.\(OR(|)\)之和. 数据范围 \(1 ...

  5. [bzoj1613][Usaco2008 Jan]Running贝茜的晨练计划_动态规划

    Running贝茜的晨练计划 bzoj-1613 Usaco-2008 Jan 题目大意:题目链接(U组题题意真的是没法概括qwq....). 注释:略. 想法:一眼dp题. 状态:dp[i][j]表 ...

  6. 「C语言」常量和变量的表示、应用和变量命名规则

    在程序运行中,其值不能改变的量成为常量. 在基本数据类型中,常量可分为整型常量.实型常量.符号常量和字符型常量(包括字符常量和字符串常量),现分别介绍如下: 目录: 一.常量 二.C语言标识符 三.变 ...

  7. 「AHOI2014/JSOI2014」宅男计划

    「AHOI2014/JSOI2014」宅男计划 传送门 我们首先要发现一个性质:存货天数随买食物的次数的变化类似于单峰函数. 具体证明不会啊,好像是二分加三分来证明?但是没有找到明确的严格证明. 感性 ...

  8. 「AHOI2014/JSOI2014」拼图

    「AHOI2014/JSOI2014」拼图 传送门 看到 \(n \times m \le 10^5\) ,考虑根号分治. 对于 \(n < m\) 的情况,我们可以枚举最终矩形的上下边界 \( ...

  9. 「AHOI2014/JSOI2014」奇怪的计算器

    「AHOI2014/JSOI2014」奇怪的计算器 传送门 我拿到这题首先是懵b的,因为感觉没有任何性质... 后来经过同机房dalao的指导发现可以把所有的 \(X\) 放到一起排序,然后我们可以发 ...

随机推荐

  1. Git学习记录-基本命令篇

    目录 网页在线练习地址 https://learngitbranching.js.org/ 1.git commit Git 仓库中的提交记录保存的是你的目录下所有文件的快照,就像是把整个目录复制,然 ...

  2. PCA 算法核心:高维度向量向低维度投影

    Principal Component Analysis:主成分分析 步骤 5 步: 1.去平均值,也就是将向量中每一项都减去各自向量的平均值 2.计算矩阵的方差,协方差,特征值, 3,.把特征值从大 ...

  3. springboot 自定义LocaleResolver切换语言

    springboot 自定义LocaleResolver切换语言 我们在做项目的时候,往往有很多项目需要根据用户的需要来切换不同的语言,使用国际化就可以轻松解决. 我们可以自定义springboor中 ...

  4. Redis实现分布式文件夹锁

    缘起 最近做一个项目,类似某度云盘,另外附加定制功能,本人负责云盘相关功能实现,这个项目跟云盘不同的是,以项目为分配权限的单位,同一个项目及子目录所有有权限的用户可以同时操作所有文件,这样就很容易出现 ...

  5. cocos2d-x 3.2锚点,Point,addchild,getcontensize

    一,锚点 打个比方.在墙挂一幅画时,要钉一个钉子,那个钉子就是锚点. 然后挂图时,钉子(锚点)放在要订的位置(position),订下去.完成(贴图结束). 贴图的基本点,锚点默认为(0.5,0.5) ...

  6. springboot依赖的一些配置:spring-boot-dependencies、spring-boot-starter-parent、io.spring.platform

    springboot里会引入很多springboot starter依赖,这些依赖的版本号统一管理,springboot有几种方案可以选择. 一.spring-boot-dependencies 有两 ...

  7. php 安装vld扩展

    下载地址 : http://pecl.php.net/package/vld 此处包是 : vld-0.14.0.tgz 1. tar -xvf  vld-0.14.0.tgz  -C  INSTAL ...

  8. ARM64架构下,OpenJDK的官方Docker镜像为何没有8版本

    为什么需要ARM64架构的OpenJDK8的Docker镜像 对现有的Java应用,之前一直运行在x86处理器环境下,编译和运行都是JDK8,如今在树莓派的Docker环境运行(也可能是其他ARM环境 ...

  9. Cocos2d-x 学习笔记(11.2) RotateBy RotateTo

    1. RotateBy RotateTo 两个旋转方法.RotateBy是在当前角度上旋转设置的角度.RotateTo是直接旋转到设置的角度,方向遵循“就近原则”.两者没有相互继承关系. 1.1 成员 ...

  10. 《Java并发编程实战》读书笔记-第4章 对象的组合

    设计线程安全的类 三个基本要素: 找出构成对象状态的所有变量 找出约束状态变量的不变性条件 建立对象状态的并发访问管理策略 实例封闭 将数据封装在对象内部,可以将数据的访问限制在对象的方法上,从而更容 ...