1 条题解
-
0
#include <bits/stdc++.h> using namespace std; // [1] arr数组-存储输入的数列,类型为long long(适配题目中“数小于2^31”的范围,避免溢出),最多支持200100个元素 long long arr[200100]; int main(){ // [2] n-输入的数列元素个数(正整数) int n; cin>>n; // [3] 读取n个正整数,存入arr数组(0-based索引) for(int i=0;i<n;i++) cin>>arr[i]; // [4] v-单调递增栈,用于维护当前元素左侧的“相似数”候选(栈中元素按从小到大排列,栈顶即为当前元素的相似数) stack<long long> v; // [5] 遍历数列的每个元素,计算其相似数(左侧最近的比当前数小的数) for(int i=0;i<n;i++){ // [6] 维护单调递增栈:弹出栈中所有大于等于当前元素的元素 // 逻辑:这些元素不可能成为后续元素的相似数(因为当前元素更小,后续元素会优先选择当前元素作为相似数) while(!v.empty() && arr[i] <= v.top()){ v.pop(); } // [7] 输出当前元素的相似数:栈为空则无符合条件的数(输出0),否则栈顶是左侧最近的比当前数小的数 if(v.empty()) cout<<0<<" "; else cout<<v.top()<<" "; // [8] 将当前元素压入栈,作为后续元素的相似数候选(保持栈的单调递增性) v.push(arr[i]); } return 0; }
- 1
信息
- ID
- 1266
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者