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];
}