ABC372D ABC379F 题解 单调栈二分

news/2024/11/13 12:41:48/文章来源:https://www.cnblogs.com/Hanggoash/p/18538424

ABC372D ABC379F 题解 单调栈二分

一直觉得AT上面学到的东西比CF要多一些,无意捧一踩一,但可能是我太菜的原因,毕竟ABC的题目普遍要比Div.2 简单一些。

好多次碰到这个单调栈里面二分的 trick 了,所以写一篇来总结一下。

ABC 372 D

形象地给定一系列 Buildings 的高度 \(h\) ,保证每个 \(h\) 不相等。

问一共有多少对 \((i,j)\) 满足 \(i< j\) 并且其间不存在比 \(j\) 高的建筑。

我们考虑对于一个 \(j\) ,如果它之前存在一个比它高的建筑 \(j'\) ,那么对于所有 \(j'\) 之前的 \(i\) ,其都不能和 \(j\) 构成一个合法的对,那么这个 \(j\) 对于所有这样的 \(i\) 都是可以不用考虑的。

维护

那么这样的话我们其实就可以倒序枚举 \(i\) ,然后维护一个从顶到底单调递增的单调栈,被弹出的元素一定对现在以及之后所有的 \(i\) 不会有贡献了,所以可以直接弹出。

统计答案

每个答案实际上就是当前栈里的元素个数。

后话

貌似这个版本是不用再单调栈上面二分的,然而我当时如同一个 2b ,不仅使用了二分,甚至还用了差分和前缀和来统计每一个固定的 \(j\)\(i\) 的贡献,而不是直接计算 \(i\) 的答案。

不过这也倒是间接为我在这个强化版问题上面提供了思路,导致想起来没有什么困难。

ABC 379 F

这个就是给定若干个 \((l_i,r_i)\) ,问在 \(r_i\) 的右边有多少建筑能够被 \(l_i\)\(r_i\) 处的建筑同时看到。

分析

不难发现,满足答案的建筑所必须满足的必要条件是能够被 \(l_i\) 看到,当其序号满足在 \(r_i\) 右边的时候,这就变成了一个充要条件了。

所以我们直接离线,然后按左端点从小到大排序,然后倒序枚举区间,把所有 \(l_i\) 之后序号的放进单调栈里面,之后再二分找所有序号大于 \(r_i\) 的即可

维护

不难发现,我们即使不弹出,单调栈里面元素对应的序号也一定是单调的,所以单调栈里可以直接存序号,我们在维护的时候通过序号访问高度,在查询的时候直接查询序号即可。

Code

#include<bits/stdc++.h>
using namespace std;
template<typename T>inline void re(T &x)
{x=0;int f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}x*=f;
} 
template<typename T>inline void wr(T x)
{if(x>9)wr(x/10);putchar(x%10^48); 
}
inline void out(int x){wr(x),putchar('\n');}
const int N=2e5+10;
int stk[N],top;
struct seg
{int l,r,idx;
}a[N];
inline bool cmp(seg x,seg y)
{return x.l<y.l;
}
int ans[N]; 
int main()
{int n,q;cin>>n>>q;vector<int> h(n+1);for(int i=1;i<=n;++i)re(h[i]);for(int i=1;i<=q;++i)re(a[i].l),re(a[i].r),a[i].idx=i;sort(a+1,a+q+1,cmp);auto insert=[&](int x){while(top&&h[x]>h[stk[top]])top--;stk[++top]=x;};auto bs=[&](int id){if(id>=stk[1])return 0;int l=1,r=top;while(l<r){int mid=(l+r+1)>>1;if(stk[mid]>id)l=mid;else r=mid-1;}return l;};int las=n;for(int i=q;i>=1;--i){for(int id=las;id>a[i].l;--id)insert(id);las=a[i].l;	ans[a[i].idx]=bs(a[i].r);
//		printf("%d:%d\n",a[i].idx,bs(a[i].r));}for(int i=1;i<=q;++i)out(ans[i]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/830797.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黑马PM- B端产品- CRM产品概述

CRM的定义CRM的核心要素CRM的设计思路

推荐模型梳理

Summary 目录Summary标准序列推荐模型其他推荐模型FPMCDNN(Pooling)GRU4Rec(RNN-based)GRU4Rec+(RNN-based)Caser(CNN-based)SASRec(Transformer-based)DIN(Transformer-based)BERT4Rec(Transformer-based)TiSASRec(Transformer-based)FMLP-Rec(Transformer-b…

程序是怎样跑起来的

总结自书籍:https://weread.qq.com/web/reader/94332ce0813ab7cc8g016ad1#outline?noScroll=1计算机的组成:运算器、控制器、存储器、输入设备、输出设备计算机内部都是由集成电路构成的,CPU和内存本质上都是集成电路,集成电路是由大量晶体管构成的电子部件集成电路的所有…

『模拟赛』NOIP2024(欢乐)加赛3(更新 T4 T5 T6)

『模拟赛记录』NOIP2024(欢乐)加赛3Rank 真欢乐吗, 不过 mission accomplished.A. Sakurako and Water CF2033B *900 byd 还懂难易搭配,不过这个 b 翻译甚至不着重以下主对角线差评,被硬控半个小时,直到手模样例才发觉不对。 读懂题就很简单了,最优一定是找最长的对角线…

【论文系列】之 ---- BERT

BERT(Bidirectional Encoder Representation from Transformers) 机器阅读理解领域 从名字很好理解,主要使用的方法是Transformer的方法。。进行机器翻译等操作(1)词嵌入Embedding 词嵌入又有三个部分组成:Token EmbeddingSegment EmbeddingPosiiton Embedding 文本出现的…

【神经网络组件】Transformer Encoder

【神经网络组件】Transformer Encoder 目录【神经网络组件】Transformer Encoder1. seq2seq模型2. 为什么只需要Transformer Encoder3. Transformer Encoder的结构 1. seq2seq模型什么是sequence:sequence指由多个向量组成的序列。例如,有三个向量:\(\mathbf{a} = [1,0,0]^T…

黑马PM- B端产品-B端基础知识

什么是B端产品B端产品市场介绍B端产品常见分类B端与C端产品区别供应链简介

Roma and Poker

算法 因为这题是从差分约束专题来的, 所以肯定要朝着化为不等式的方向化简 令 \(TimeW_i, TimeD_i, TimeL_i\) 表示原串前 \(i\) 位中 \(W, D, L\) 的个数 令 \(W_i, D_i, L_i\) 表示最后结果中前 \(i\) 位 \(W, D, L\) 的个数 根据原串有 \[\left\{ \begin{array}{lr} W_i \…

Cocos Creator 如何调试代码?

一、方式调试代码两种方式: 在VS code中调试在浏览器中调试二、调试一:VS Code中Chrome浏览器 打开VS Code中的插件下载Debugger for Chrome/JavaScript Debugger 打开Cocos Creator点击菜单中的开发者选项 选择Visual Studio Code 工作流 -> 添加Chrome debug配置,此时VS…

旋转矢量合成,两个圆圈

import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Circle, FancyArrowPatch from matplotlib.animation import FuncAnimation# 创建一个新图和两个坐标轴 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))# 设置坐标轴的等比例,确…

华三配置mstp

S1配置 stp mode mstp stp region-configuration region-name a revision-level 1 instance 1 vlan 10 instance 2 vlan 20 active region-configuration qu stp instance 1 root primary stp instance 2 root secondary stp global enable === S2配置 stp region-configuratio…

2024-2025-1 20241411 《计算机基础与程序设计》第七周学习总结

作业信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP/这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK07这个作业的目标 数组与链表、基于数组和基于链表实现数据结构、无序表与有序表、树、图、子程序与参数作业正文…