题解:CF2110C Racing

考虑到我们的飞行器是单调不降的,那么我们的上下限也是单调不降的。

这样我们就可以递推出上下界。

但是有一个小细节,如果某一个位置我确定了要向上升一格,那么前面的一格就要预留出相应的空间,不能顶到原本的最大。

代码也不复杂。

#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 5;

int d[N], l[N], r[N];// lr数组分别为上下限
int sum[N];

void solve() {
    int n;
    cin >> n;
    for(int i = 1;i <= n;i ++ ) {
        cin >> d[i];
        sum[i] = sum[i - 1] + (d[i] == 1);
    }
    for(int i = 1;i <= n;i ++ ) {
        cin >> l[i] >> r[i];
        l[i] = max(l[i], l[i - 1]);
    }
    for(int i = n - 1;i >= 1;i -- ) { // 第 n 个不用动
        r[i] = min(r[i + 1] - (d[i + 1] == 1), r[i]);
    }
    int h = 0;
    for(int i = 1;i <= n;i ++ ) {
        if(d[i] != -1) h += d[i];
        else {
            if(h < r[i]) d[i] = 1, h ++ ;
            else d[i] = 0;
        }
        if(h < l[i]) {
            cout << "-1\n";
            return ;
        }
        if(h > r[i]) {
            cout << "-1\n";
            return ;
        }
    }
    for(int i = 1;i <= n;i ++ ) cout << d[i] << " ";
    cout << "\n";
}

int main() {
    int T;
    cin >> T;
    while(T -- ) {
        solve();
    }
    return 0;
}
posted @ 2025-09-16 19:44  yanbinmu  阅读(5)  评论(0)    收藏  举报