[区间收缩] hdu 6860 Fluctuation Limit

题目

在这里插入图片描述
题目链接: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];
		}
	}
}

猜你喜欢

转载自blog.csdn.net/kosf_/article/details/108010362