1 条题解

  • 0
    @ 2026-1-28 10:46:45
    #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
    上传者