题目
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6860
思路
设up[i]和down[i]是第i位能达到的最大上限与最低下限
由题可知:
down[i]>=down[i-1]-k
up[i]<=up[i-1]+k
所以先按照这个处理一遍
但是要注意 可能会出现down[i]+k<=down[i+1]的情况
所以要再从后往前放缩一次区间
代码
#include<bits/stdc++.h>
using namespace std;
int l[100010],r[100010],up[100010],down[100010];
int main(){
int t;
cin>>t;
while(t--){
int n,m;
scanf("%d%d",&n,&m);
bool flag=1;
for(int i=1;i<=n;i++){
scanf("%d%d",&l[i],&r[i]);
if(i==1){
up[i]=r[i];
down[i]=l[i];
}
else{
up[i]=min(up[i-1]+m,r[i]);
down[i]=max(down[i-1]-m,l[i]);
}
if(up[i]<down[i]) flag=0;
}
for(int i=n-1;i>=1;i--){
up[i]=min(up[i+1]+m,up[i]);
down[i]=max(down[i+1]-m,down[i]);
if(up[i]<down[i]) flag=0;
}
if(!flag) cout<<"NO"<<endl;
else{
cout<<"YES"<<endl;
for(int i=1;i<=n;i++) cout<<down[i]<<" \n"[i==n];
}
}
}