news 2026/7/29 22:15:16

第二周 题目练习2(stack综合 单调栈)牛客 14326. 14666. 15029

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第二周 题目练习2(stack综合 单调栈)牛客 14326. 14666. 15029

栈版子

Rails

栈模拟模板题,核心思路是模拟真实的入栈、出栈过程

#include<bits/stdc++.h> #define ll long long #define endl '\n' #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second #define YES cout<<"YES"<<endl; #define NO cout<<"NO"<<endl; using namespace std; ll n; int main() { IOS while(cin>>n&&n!=0) { ll x; while(cin>>x) { if(x==0)break; vector<ll>goal; goal.push_back(x); for(ll i=1;i<n;i++) { cin>>x; goal.push_back(x); } stack<ll>st; ll num=1; bool ok=true; for(ll a:goal) { while(st.empty()||st.top()!=a) { st.push(num); num++; if(num>n+1) { ok=false; break; } } if(!ok)break; st.pop(); } if(ok)cout<<"Yes"<<endl; else cout<<"No"<<endl; } cout<<endl; } // cout<<fixed<<setprecision(x)<< ; return 0; }

最优屏障

给定一排山峰,两座山可以相互看见当且仅当它们中间没有更高或等高的山。在某两座山之间放置屏障,会切断所有跨越该位置的可视山峰对。

要求:找到切断可视对最多的屏障位置;若多个位置答案相同,输出编号最小的位置。

解题过程

1.核心思想:贡献法 + 单调栈 + 差分

直接暴力枚举所有山峰对会超时。

因此枚举每一对可见山峰,给对应的屏障区间统计贡献。

对于任意一对可见山峰 (l, r):

屏障放在 [l, r-1] 任意位置,都能切断这一对。

等价于:对区间 [l, r-1]整体 +1。

2.差分优化区间修改

一维差分可以 O(1) 完成区间加:

区间 [L,R] +1:d[L]++, d[R+1]–

本题代入:L=l,R=r-1,得到固定写法:

d[l]++, d[r]–

3.单调栈找所有可见山峰对

维护一个单调递减栈存储山峰下标:

遍历当前山峰 r,弹出所有左侧更矮的山 l:两者可见,统计贡献

栈不为空时,剩余栈顶高山也与 r 可见,统计贡献但不弹出(后续继续使用)

当前山峰入栈,维持单调性

4.前缀和求答案

对差分数组做前缀和,得到每个屏障位置切断的总对数,遍历维护最大值、最小下标即可

注:题目屏障下标从第 1、2 座山之间开始,代码统计下标偏移,所以最终输出需要 ansx+1

代码实现

#include<bits/stdc++.h> #define ll long long #define endl '\n' // #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second #define YES cout<<"YES"<<endl; #define NO cout<<"NO"<<endl; using namespace std; ll t; ll n; ll ansx,now,maxless; int main() { scanf("%lld",&t); for(ll cas=1;cas<=t;cas++) { scanf("%lld",&n); vector<ll>h(n+2); vector<ll>d(n+2,0); for(ll i=1;i<=n;i++) { scanf("%lld",&h[i]); } stack<ll>st; for(ll r=1;r<=n;r++) { while(!st.empty()&&h[st.top()]<h[r]) { ll l=st.top(); st.pop(); //可视对(l,r) ,等价于[l,r-1]+1; d[l]+=1; d[r]-=1; } if(!st.empty()) { ll l=st.top(); d[l]++; d[r]--; } st.push(r); } now=0; maxless=-1; ansx=1; for(ll i=1;i<=n;i++) { now+=d[i]; if(now>maxless||(now==maxless&&i<ansx)) { maxless=now; ansx=i; } } printf("Case #%lld: %lld %lld\n",cas,ansx+1,maxless); } // cout<<fixed<<setprecision(x)<< ; return 0; }

吐泡泡

解题过程

栈实时 化简:遍历字符串,逐个字符入栈;
每入栈一个字符,循环检查栈顶两个元素,满足合并 / 抵消规则则立即处理,直至无法匹配。
结果顺序处理:栈结构先进后出,取出栈内字符会得到逆序字符串,最后反转字符串得到正确顺序输出;

代码实现

#include<bits/stdc++.h> #define ll long long #define endl '\n' #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second #define YES cout<<"YES"<<endl; #define NO cout<<"NO"<<endl; using namespace std; ll t; string s; string ans; int main() { IOS cin>>t; while(t--) { cin>>s; ll l=s.size(); stack<char>st; for(char c:s) { st.push(c); while(st.size()>=2) { char top1=st.top(); st.pop(); char top2=st.top(); if(top1=='o'&&top2=='o') { st.pop(); st.push('O'); } else if(top1=='O'&&top2=='O') { st.pop(); } else { st.push(top1); break; } } } ans=""; while(!st.empty()) { ans+=st.top(); st.pop(); } reverse(ans.begin(),ans.end()); cout<<ans<<endl; } // cout<<fixed<<setprecision(x)<< ; return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/29 22:10:42

5分钟掌握终极免费音乐解锁工具:浏览器本地解密完整指南

5分钟掌握终极免费音乐解锁工具&#xff1a;浏览器本地解密完整指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: htt…

作者头像 李华
网站建设 2026/7/29 22:10:40

SuperCom串口调试工具:嵌入式开发的终极解决方案

SuperCom串口调试工具&#xff1a;嵌入式开发的终极解决方案 【免费下载链接】SuperCom SuperCom 是一款串口调试工具 项目地址: https://gitcode.com/gh_mirrors/su/SuperCom 想象一下&#xff0c;你正在调试一个物联网设备&#xff0c;需要同时监控多个传感器数据、发…

作者头像 李华
网站建设 2026/7/29 22:09:47

AlohaMini进阶开发:自定义控制算法与ROS节点扩展指南

AlohaMini进阶开发&#xff1a;自定义控制算法与ROS节点扩展指南 【免费下载链接】AlohaMini Open-Source Dual-Arm Mobile Robot with Motorized Lift 项目地址: https://gitcode.com/gh_mirrors/al/AlohaMini AlohaMini是一款开源双臂移动机器人&#xff0c;具备电动升…

作者头像 李华
网站建设 2026/7/29 22:09:17

Anna KVS云原生特性详解:自动扩缩容如何降低90%云服务成本?

Anna KVS云原生特性详解&#xff1a;自动扩缩容如何降低90%云服务成本&#xff1f; 【免费下载链接】anna A low-latency, cloud-native KVS 项目地址: https://gitcode.com/gh_mirrors/an/anna Anna KVS是一款低延迟的云原生键值存储系统&#xff08;KVS&#xff09;&a…

作者头像 李华
网站建设 2026/7/29 22:08:53

Apicurio Registry与Helm集成:Kubernetes包管理的终极指南

Apicurio Registry与Helm集成&#xff1a;Kubernetes包管理的终极指南 【免费下载链接】apicurio-registry An API/Schema registry - stores APIs and Schemas. 项目地址: https://gitcode.com/GitHub_Trending/ap/apicurio-registry Apicurio Registry是一款功能强大的…

作者头像 李华