题解: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;
}

浙公网安备 33010602011771号