题解:AT_abc359_e [ABC359E] Water Tank
背景
中考结束了,但是暑假只有一天,这就是我现在能在机房里面写题解的原因……
分析
这道题就是个单调栈。
题目上问你第一滴水流到每个位置的时间。我们考虑,答案其实就是比当前木板高且距离当前木板最近的那一个位置的答案加上当前木板的高度与那一个位置的距离构成的矩形面积再减去中间较低木板构成的矩形面积。这个思路联想到单调栈的话还是很好想到的。
所以我们存一个结构体栈,两个参数分别表示这个位置木板的高度和与上一个比它高的木板的距离。
在更新的时候,先按照一般单调栈操作用当前木板高度去更新栈的信息,用一个变量统计距离之和,并把每个栈位最终会影响答案的矩形面积累加一下。放一下代码:
while(!st.empty()&&st.top().h<=h[i])
{
int now=st.top().h,sum=st.top().sum;
dat+=now*sum;
t+=sum;
st.pop();
}
然后按照思路更新当前答案并输出,再让当前木板高度和距离进栈即可。
Code
#include<bits/stdc++.h>
#define int long long
#define mod 998244353
using namespace std;
inline int read()
{
int w=1,s=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch)){s=s*10+(ch-'0');ch=getchar();}
return w*s;
}
const int maxn=1e6+10;
int n,h[maxn];
int ans=1;
struct no
{
int h,sum;
};
stack<no> st;
signed main()
{
// freopen("xxx.in","r",stdin);
// freopen("xxx.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)h[i]=read();
for(int i=1;i<=n;i++)
{
int t=1,dat=0;
while(!st.empty()&&st.top().h<=h[i])
{
int now=st.top().h,sum=st.top().sum;
dat+=now*sum;
t+=sum;
st.pop();
}
ans=ans+h[i]*t-dat;
st.push({h[i],t});
printf("%lld ",ans);
}
return 0;
}
题解:AT_abc359_e [ABC359E] Water Tank的更多相关文章
- HDU 5575 Discover Water Tank(左偏树)
https://vjudge.net/problem/HDU-5575 题意: 有一个水箱,被n-1块板子分成了n个部分,板子的高度不尽相同.现在有m次探测,每次探测在第x部分的y+0.5高度处是否有 ...
- Leetcode 题解 Trapping Rain Water
题目链接:https://leetcode.com/problems/trapping-rain-water/description/ 思路: 1.先找到最左侧第一个高度不为0的柱子i. 2.从i+1 ...
- HDU 5575 Discover Water Tank 并查集 树形DP
题意: 有一个水槽,边界的两块板是无穷高的,中间有n-1块隔板(有高度),现有一些条件(i,y,k),表示从左到右数的第i列中,在高度为(y+0.5)的地方是否有水(有水:k = 1),问最多能同时满 ...
- hdu5575 Discover Water Tank
题意: 给出个水箱,水箱两侧有无限高的隔板,水箱内有整数高度的隔板将水箱分成n-1份,现在给出m个限制,每个限制表示某个位置的某个高度有水或没水,问最多能同时满足多少个限制.n,m<=2*10^ ...
- CF414D Mashmokh and Water Tanks
CF414D Mashmokh and Water Tanks 洛谷评测传送门 题目描述 Mashmokh is playing a new game. In the beginning he has ...
- PID控制器(比例-积分-微分控制器)- I
形象解释PID算法 小明接到这样一个任务: 有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就要往水缸里加水. 小明接到任务后就一直守在水 ...
- ZOJ 5579 Stean
Stean Time Limit: 1 Second Memory Limit: 65536 KB Special Judge Tom is good at making stea ...
- CodeForces 362E Petya and Pipes
Petya and Pipes Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on CodeForces. ...
- What are CBR, VBV and CPB?
转自:https://codesequoia.wordpress.com/2010/04/19/what-are-cbr-vbv-and-cpb/ It's common mistake to to ...
- [LeetCode]题解(python):042-Trapping Rain Water
题目来源 https://leetcode.com/problems/trapping-rain-water/ Given n non-negative integers representing a ...
随机推荐
- java的synchronized有几种加锁方式
在Java中,synchronized关键字提供了内置的支持来实现同步访问共享资源,以避免并发问题.synchronized主要有三种加锁方式: 1.同步实例方法 当一个实例方法被声明为synchro ...
- 阿里巴巴 MySQL 数据库之索引规约 (二)
索引规约 强制部分 [强制] 业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引. 说明:不要以为唯一索引影响了 insert 速度,这个速度损耗可以忽略,但提高查找速度是明显的:另外 ...
- Pandas学习之路【3】
新增列的一些操作 1.新增一个列,直接给列赋值 # 取所有行,新增的列为new_col df.loc[:, 'new_col'] = 100 2.使用df.apply方法给新增的列赋值 def get ...
- Python 潮流周刊#53:我辈楷模,一个约见诺奖得主,一个成为核心开发者
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- JavaScript语法形式2 内部式
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- java springboot 指定运行端口
java springboot 指定运行端口 方法1: 修改源代码里的"\src\main\resources\application.properties" 文件,增加或修改 s ...
- 安装sql 2012 时遇到“需要更新的以前的 Visual Studio 2010 实例。”规则失败。
"需要更新的以前的 Visual Studio 2010 实例."规则失败.此计算机安装了需要 Service Pack 1 更新的 Visual Studio 2010,必须安装 ...
- 太卷了,史上最简单的监控系统 catpaw 简介
指标监控的痛点 当下比较流行的监控系统,比如 Prometheus.Nightingale.VictoriaMetrics,都是基于数值型指标的监控系统,这类监控系统的痛点在于:告警的时候只能拿到异常 ...
- Invalid revision: 3.18.1-g262b901-dirty CMake Error: CMake was unable to find a build program corresponding to "Ninja".
一次在GitHub上找到的项目,本想编译运行下,但报如下的问题 错误一 Invalid revision: 3.18.1-g262b901-dirty 解决办法: 这是因为版本不对应,可在local. ...
- MegaCli命令使用整理
1. 软件安装 rpm -ivh Lib_Utils-1.00-09.noarch.rpm rpm -ivh MegaCli-8.02.21-1.noarch.rpm 2. 常用命令 /opt/Meg ...