原题

有n个盘子组成的塔,向第i个盘子上倒水,若溢出会落到下面第一个直径大的盘子里,直到落到底部的水池为止。现给出q次询问,\((r,v)\)代表向第r个盘子里倒入体积为v的水,求水最终会停在哪个盘子

一开始用ST表保存区间内盘子直径最大值,给出 \(r\) 后,递归求解 \([ r,n ]\) 区间内最大值k,并继续求 \([r,k]\) 区间内最大值,直到取到第 \(r\) 个,回溯过程中逐步计算储水量。

但是看到严格单调递增序列就放弃了

然后卡了一段时间,突然发现好像有点眼熟 (

第一个想法

看正的比较难想,但横过来就很直观

当我们说水向下流,实际上我们在说水向右找到第一个比他大的盘子,那么就是单调栈了

数组 \(f[i]\) 表示第i个盘子下边第一个比他大的盘子编号,这样形成链状的查询,可以依次访问

但数据量太大,时间复杂度还是很高

因此要用倍增,类似ST表的方法,每次跳跃跳2的幂次

数组 \(f[i][j]\) 存储从第i个盘子开始,跳 \(2^j\) 到达的盘子编号

数组 \(summ[i][j]\) 存储从第i个盘子开始,到之上 \(2^j\) 个盘子的储水量总和

查询的时候特判当前储水量,然后从大到小循环j,向上跳跃,最后输出父节点

第二个想法 (但是没写

可以看到在一个大的盘子之上有许多小盘子依次连接,最终汇聚到一个统一的大盘子,又最终汇聚到底部的水池

于是这提醒我们想到树

对于一个盘子,他下面第一个直径大于它的盘子为他的父节点,上面所有可以到达他的盘子为他的子树,根节点代表底部水池

那么从叶节点向上遍历即为流水顺序,在这过程中计算储水量

但是数据太大,所以仍然要用到倍增,使用类似倍增求LCA的方法,向上寻找

但是不是求公共祖先,实质上和第一种方法相同,只不过套上了树的形式

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#define ll long long
using namespace std;
const int N = 1e5 + 10;
int n, q, d[N], c[N], R, V, f[N][20], summ[N][20];
stack<int>s;
inline void Monotonic_Stack() { // 单调栈板子
for(int i = 1; i <= n; i ++) {
while (!s.empty() && d[i] > d[s.top()]) {
f[s.top()][0] = i; // 初始化右边第一个大的盘子编号
summ[s.top()][0] = c[i]; // 初始化总和
s.pop();
}
s.push(i);
}
while(!s.empty()) f[s.top()][0] = 0, s.pop();
}
inline void PrepareRMQ() { // ST表板子
for (int j = 1; (1 << j) <= n; j ++)
for (int i = 1; i <= n - (1 << j); i ++) {
f[i][j] = f[f[i][j - 1]][j - 1];
summ[i][j] = summ[i][j - 1] + summ[f[i][j - 1]][j - 1];
}
}
inline int query(int r, int val) { // 计算
if (c[r] >= val) return r;
val -= c[r]; // 先减掉当前盘子容量
for (int i = 18; i >= 0; i --)
if (f[r][i] && val > summ[r][i]) {
val -= summ[r][i]; // 向上寻找
r = f[r][i]; // 更新位置
}
return f[r][0]; // 返回父节点
}
int main() {
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i ++) scanf("%d%d", &d[i], &c[i]);
Monotonic_Stack(); // 单调栈
PrepareRMQ(); // 准备工作
while (q -- ) {
scanf("%d%d", &R, &V);
printf("%d\n", query(R, V));
}
return 0;
}

P7167 Fountain的更多相关文章

  1. 洛谷P7167 [eJOI 2020 Day1] Fountain (单调栈+ST)

    开两个数组:to[i][j]表示从i这个位置向下的第2j个圆盘是哪个,f[i][j]表示流满从i这个位置向下的 2j 个圆盘需要多少体积的水. 详情见代码: 1 #include<bits/st ...

  2. [AtCoder 2702]Fountain Walk - LIS

    Problem Statement In the city of Nevermore, there are 108 streets and 108 avenues, both numbered fro ...

  3. 【xsy1503】 fountain DP

    题目大意:给你$D$个格子,有$n$个喷水器,每个喷水器有一个喷水距离$r_i$. 现在你需要在这$D$个格子中选择$n$个位置按照任意顺序安装这$n$个喷水器,需要满足$n$个喷水器互相喷不到对方. ...

  4. 【agc019C】Fountain Walk

    Portal --> agc019C Description 有一个\(10^8*10^8\)的网格图,一格距离为\(100\),第\(x\)条竖线和第\(y\)条横线的交点记为\((x,y)\ ...

  5. Agc019_C Fountain Walk

    传送门 题目大意 给定网格图上起点和终点每个格子是长为$100$米的正方形,你可以沿着线走. 平面上还有若干个关键点,以每个关键点为圆心,$10$为半径画圆,表示不能进入圆内的线,但是可以从圆周上走, ...

  6. Yeoman 官网教学案例:使用 Yeoman 构建 WebApp

    STEP 1:设置开发环境 与yeoman的所有交互都是通过命令行.Mac系统使用terminal.app,Linux系统使用shell,windows系统可以使用cmder/PowerShell/c ...

  7. CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator

    CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator 我还没有用过Compute Shader,所以现在把红宝书里的例子拿来了,加入CSharpGL中. ...

  8. [Erlang 0114] Erlang Resources 小站 2013年7月~12月资讯合集

    Erlang Resources 小站 2013年7月~12月资讯合集,方便检索.     附 2013上半年盘点: Erlang Resources 小站 2013年1月~6月资讯合集    小站地 ...

  9. HTML5资料

    1 Canvas教程 <canvas>是一个新的用于通过脚本(通常是JavaScript)绘图的HTML元素.例如,他可以用于绘图.制作图片的组合或者简单的动画(当然并不那么简单).It ...

  10. RainCup_No.1

    Rain杯No.1 初见篇 本系列故事以及人名地名等纯属虚构,如有雷同,纯属巧合 在极东之地,有一个岛国,与岛国隔了一个海域有一个古老的国度,天朝.天朝T镇有个少年叫小S,故事从小S与少女Rain的相 ...

随机推荐

  1. [MAUI]模仿iOS多任务切换卡片滑动的交互实现

    @ 目录 原理 创建布局 创建分布函数 创建动效 创建绑定数据 细节调整 首张卡片的处理 为卡片添加裁剪 跳转到最后一张卡片 项目地址 看了上一篇博文的评论,大家对MAUI还是比较感兴趣的,非常感谢大 ...

  2. 我的web系统设计规范

    以下是我自己在工作中总结的,仅供参考. ·应对所有用户输入进行trim()去除两头空格,若是需要空格的应用 转义代替,不应在js里trim(),而应该在数据库端或后端控制,且只在一处拦截控制,更改策略 ...

  3. ET–异步协程使用–TimerComponent篇

    之前可能也有群友写过一些关于ET框架中TimerComponent的使用教程,我这里写下关于TimerComponent的常规使用跟一些不常规使用的方法以及一些情况下需要使用到的不同的函数. 先来看看 ...

  4. python Unitest和pytest 介绍和安装

    前言 目前有两种纯测试的测试框架,pytest和unittest,这系列文章主要介绍pytest为主 UnitTest测试框架理论 python 自带的单元测试框架,常用在单元测试 在自动化测试中提供 ...

  5. 2021-05-21:给定一个数组arr,先递减然后递增,返回arr中有多少个绝对值不同的数字?

    2021-05-21:给定一个数组arr,先递减然后递增,返回arr中有多少个绝对值不同的数字? 福大大 答案2021-05-21: 双指针.左指针最左,符合条件时右移:右指针最右,符合条件时左移.左 ...

  6. django时区问题的解决

    django时区问题的解决  更新时间:2021年05月18日 09:37:58   作者:Silent丿丶黑羽     我们都知道时区,标准时区是UTC时区,django默认使用的就是UTC时区,我 ...

  7. 使用 conda 和 Jupyter 创建你的自定义 R 包,转换笔记为幻灯片

    创建你的自定义 R 包 出于用户使用方便考虑,Anaconda 已经在 "R Essentials" 中打包了一些最常用的数据科学 R 包.使用 conda metapackage ...

  8. C2简介

    C2简介 学习命令与控制的基本知识,帮助您成为更好的红队队员并简化您的下一次红队评估! thm:https://tryhackme.com/room/introtoc2 介绍 命令与控制 ( C2 ) ...

  9. Python time strftime() 方法的使用

    1.描述 strftime() 用于格式化时间,返回以可读字符串表示的时间,格式自定义. 2.说明 python中日期和时间的格式化符号有很多,下面列举常用的符号:  %y 两位数的年份表示(00-9 ...

  10. Centos7安装配置Hive

    Centos7安装配置 一 . 安装 安装就不多做详述,选择好自己的镜像设置好路径即可 二 .配置 2.1 网络配置 桌面右键进入 cmd 命令编辑窗口,在 Linux 中设置网络的相关配置都需要管理 ...