题目描述

夏日那让人喘不过气的酷热将奶牛们的烦躁情绪推到了最高点.最终,约翰决定建一个人工湖供奶牛消暑之用. 
为了使湖看起来更加真实,约翰决定将湖的横截面建成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. react16 路由按需加载、路由权限配置

    1. 路由按需加载: 不做按需加载,代码全部打包在bundle.js 文件里,首屏渲染很慢,项目文件较多,会出现1分钟加载的可能性. import React, { Component } from ...

  2. JavaScript事件属性event.target和currentTarget 属性的区别。

    event.target 获取的是触发事件的标签元素 event.currentTarget 获取到的是发起事件的标签元素 一.事件属性:event.target target事件委托的定义:本来该自 ...

  3. LRU算法实现,HashMap与LinkedHashMap源码的部分总结

    关于HashMap与LinkedHashMap源码的一些总结 JDK1.8之后的HashMap底层结构中,在数组(Node<K,V> table)长度大于64的时候且链表(依然是Node) ...

  4. 张高兴的 .NET Core IoT 入门指南:(五)串口通信入门

    在开始之前,首先要说明的是串口通信所用到的 SerialPort 类并不包含在 System.Device.Gpio NuGet 包中,而是在 System.IO.Ports NuGet 包中.之所以 ...

  5. drf框架中分页组件

    drf框架中分页组件 普通分页(最常用) 自定制分页类 pagination.py from rest_framework.pagination import PageNumberPagination ...

  6. 微信小程序中事件

    微信小程序中事件 一.常见的事件有 类型 触发条件 最低版本 touchstart 手指触摸动作开始 touchmove 手指触摸后移动 touchcancel 手指触摸动作被打断,如来电提醒,弹窗 ...

  7. 解决VS2017授权问题及没有Add ArcGIS License Checking问题

    内容源自:ArcGIS Engine+C#入门经典 老版本采用: 控件布局好后,需要对程序添加License许可.在Visual Studio的菜单栏上单击“项目”→单击“Add ArcGIS Lic ...

  8. 零基础:如何快速学习JavaScript,html+css技术

    前端开发要学的知识内容涉及的会很宽泛,虽然说主要是HTML.CSS和JavaScript这些基础知识点,但达妹今天想强调一下,学前端开发除了要学这些基础知识外,学员还要在这之上进行延伸和深入的去学,而 ...

  9. webshell之一句话木马变形

    什么是一句话木马 一句话木马就是只需要一行代码的木马,短短一行代码,就能做到和大马相当的功能.为了绕过waf的检测,一句话木马出现了无数中变形,但本质是不变的:木马的函数执行了我们发送的命令. 我们如 ...

  10. 推荐几个IT交流社区

    博客园,csdn,掘金,StackOverflow(境外),v2ex,开源中国,简书,头条