一直觉得AT上面学到的东西比CF要多一些,无意捧一踩一,但可能是我太菜的原因,毕竟ABC的题目普遍要比Div.2 简单一些。
好多次碰到这个单调栈里面二分的 trick 了,所以写一篇来总结一下。
形象地给定一系列 Buildings 的高度 ,保证每个 不相等。
问一共有多少对 满足 并且其间不存在比 高的建筑。
我们考虑对于一个 ,如果它之前存在一个比它高的建筑 ,那么对于所有 之前的 ,其都不能和 构成一个合法的对,那么这个 对于所有这样的 都是可以不用考虑的。
那么这样的话我们其实就可以倒序枚举 ,然后维护一个从顶到底单调递增的单调栈,被弹出的元素一定对现在以及之后所有的 不会有贡献了,所以可以直接弹出。
每个答案实际上就是当前栈里的元素个数。
貌似这个版本是不用再单调栈上面二分的,然而我当时如同一个 2b ,不仅使用了二分,甚至还用了差分和前缀和来统计每一个固定的 对 的贡献,而不是直接计算 的答案。
不过这也倒是间接为我在这个强化版问题上面提供了思路,导致想起来没有什么困难。
这个就是给定若干个 ,问在 的右边有多少建筑能够被 和 处的建筑同时看到。
不难发现,满足答案的建筑所必须满足的必要条件是能够被 看到,当其序号满足在 右边的时候,这就变成了一个充要条件了。
所以我们直接离线,然后按左端点从小到大排序,然后倒序枚举区间,把所有 之后序号的放进单调栈里面,之后再二分找所有序号大于 的即可
不难发现,我们即使不弹出,单调栈里面元素对应的序号也一定是单调的,所以单调栈里可以直接存序号,我们在维护的时候通过序号访问高度,在查询的时候直接查询序号即可。
| #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); |
| |
| } |
| for(int i=1;i<=q;++i)out(ans[i]); |
| return 0; |
| } |
| |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!