量子LSTM实战:门控机制映射到参数化量子电路的工程实现
2026/10/25 19:28:55
给定一个山脉的二维剖面,由NNN个点组成,每个点有一个海拔高度HiH_iHi(单位:厘米)。 我们需要找出所有Ultras\texttt{Ultras}Ultras山峰,即那些地形突出度(topographic prominence\texttt{topographic prominence}topographic prominence)大于等于150000150000150000厘米的山峰。
对于海拔为hhh的山峰ppp,其突出度定义为最大的ddd,使得从ppp到任意更高山峰的任何路径都必须经过一个海拔为h−dh-dh−d的点。 如果没有更高的山峰,则突出度就是hhh本身。
输出所有Ultras\texttt{Ultras}Ultras的索引(按出现顺序, 从111开始编号)。
这个问题本质上是计算每个山峰的地形突出度,然后筛选出满足条件的山峰。 关键在于如何高效地计算突出度。
对于位置iii的山峰(海拔H[i]H[i]H[i]):
寻找左右第一个更高山峰:
查询区间最小值:
边界处理:
// Go up the Ultras// UVa ID: 12674// Verdict: Accepted// Submission Date: 2025-12-24// UVa Run Time: 0.100s//// 版权所有(C)2025,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intn;while(cin>>n){vector<int>h(n);for(inti=0;i<n;i++)cin>>h[i];// 左边第一个严格更高的位置vector<int>leftHigher(n,-1);stack<int>st;for(inti=0;i<n;i++){while(!st.empty()&&h[st.top()]<=h[i])st.pop();if(!st.empty())leftHigher[i]=st.top();st.push(i);}// 右边第一个严格更高的位置while(!st.empty())st.pop();vector<int>rightHigher(n,n);for(inti=n-1;i>=0;i--){while(!st.empty()&&h[st.top()]<=h[i])st.pop();if(!st.empty())rightHigher[i]=st.top();st.push(i);}// 构建稀疏表(RMQ)用于快速查询区间最小值intlogn=1;while((1<<logn)<=n)logn++;vector<vector<int>>minTable(logn,vector<int>(n));for(inti=0;i<n;i++)minTable[0][i]=h[i];for(intk=1;k<logn;k++)for(inti=0;i+(1<<k)<=n;i++)minTable[k][i]=min(minTable[k-1][i],minTable[k-1][i+(1<<(k-1))]);// 区间最小值查询函数autorangeMin=[&](intl,intr){if(l>=r)returnINT_MAX;intk=31-__builtin_clz(r-l);returnmin(minTable[k][l],minTable[k][r-(1<<k)]);};// 计算每个山峰的突出度并找出 Ultrasvector<int>ultras;for(inti=1;i<n-1;i++){intleftMin=0;if(leftHigher[i]!=-1)leftMin=rangeMin(leftHigher[i]+1,i);intrightMin=0;if(rightHigher[i]!=n)rightMin=rangeMin(i+1,rightHigher[i]);intprominence;if(leftHigher[i]==-1&&rightHigher[i]==n)prominence=h[i];elseprominence=h[i]-max(leftMin,rightMin);if(prominence>=150000)ultras.push_back(i+1);}// 输出结果if(!ultras.empty()){cout<<ultras[0];for(size_t i=1;i<ultras.size();i++)cout<<" "<<ultras[i];}cout<<"\n";}return0;}本题的关键在于理解地形突出度的定义,并将其转化为可计算的算法。 通过单调栈快速找到每个山峰左右第一个更高山峰,再结合RMQ\texttt{RMQ}RMQ快速查询区间最小值,即可高效计算出每个山峰的突出度。 算法复杂度O(NlogN)O(N \log N)O(NlogN),完全满足题目要求。
需要注意的细节包括:
这个问题的解法综合运用了单调栈和稀疏表两种数据结构,是一道很好的练习题目。