CF2110 C. Racing

C.Racing


原题链接

题意简述

给定一个飞行序列 \(d\) 和一个障碍序列 \(L\) , \(R\) ,要求在第i个位置中飞行物的高度 \(L[i]\leq h \leq R[i]\),对于d的取值有两种种情况 {1,0}当d为-1时表示当前值是不确定的。
请你确定d数组,使得飞行物能够穿过所有障碍,如果无论如何都无法确定,输出-1.

解题思路

先思考什么时候出-1,不难发现当当前最大可能高度都小于 \(L[i]\) 或最小可能高度都大于 \(R[i]\),那么当前序列一定不可能满足条件。再考虑如何构造,一种比较简单的思路是,拿栈或队列存储每个可能增加或是不变的位置,当最小可能高度比L[i]小,取出队列或栈中元素不断累加到最小可能高度中,当最大可能高度比R[i]大,不断取出队列或栈中元素减小最大可能高度。遍历完一趟后清除队列或栈中元素即可。

AC code

void solve(){
    int n;cin>>n;
    vector<int>a(n+1);
    for(int i=1;i<=n;i++) cin>>a[i];
    vector<int>L(n+1);
    vector<int>R(n+1);
    for(int i=1;i<=n;i++) cin>>L[i]>>R[i];
    int h=0;
    stack<int>st;
    for(int i=1;i<=n;i++){
        if(a[i]!=-1) h+=a[i];
        else st.push(i);
        if(h+st.size()<L[i]||h>R[i]) {
            cout<<-1<<endl;
            return;
        }
        while(!st.empty()&&h<L[i]){
            a[st.top()]=1;
            ++h;
            st.pop();
        }
        while(h+st.size()>R[i]){
            a[st.top()]=0;
            st.pop();
        }
    }
    while(!st.empty()){
        a[st.top()]=0;
        st.pop();
    }
    for(int i=1;i<=n;i++) cout<<a[i]<<" \n"[i==n];
}
posted @ 2025-05-25 12:53  usedchang  阅读(101)  评论(3)    收藏  举报