题意:有n个区间和数k,相邻区间的上限和下限变化都不超过k,是否可以获得一组数列对应的数满足在对应的区间内,且相邻两数变化不超过k。
思路:相邻区间互相限制,从左至右判断若i在 [l,r] 范围内,那么i+k应该在 [i-k,i+k] 范围内,再从右到左判断一遍,可能有多个结果,可输出最小的,也就是l[i]。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+100;
int l[maxn],r[maxn];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int tcase;
cin>>tcase;
while(tcase--){
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>l[i]>>r[i];
}
//从左往右
for(int i=0;i<n-1;i++){
l[i+1]=max(l[i+1],l[i]-k);
r[i+1]=min(r[i+1],r[i]+k);
}
//从右往左
for(int i=n-1;i>0;i--){
l[i-1]=max(l[i-1],l[i]-k);
r[i-1]=min(r[i-1],r[i]+k);
}
bool flag = true;
for(int i=0;i<n;i++){
if(l[i]>r[i]){
flag = false;
}
}
if(flag){
cout<<"YES"<<endl;
for(int i=0;i<n;i++){
if(i!=n-1){
cout<<l[i]<<" ";
}
else{
cout<<l[i]<<endl;
}
}
}
else{
cout<<"NO"<<endl;
}
}
return 0;
}