HDU-Fluctuation Limit(区间问题)

题目链接

题意:给你n个价格范围l,r,问最后没组价格的上下浮动能不能不超过k

思路:要让价格不超过k,设i的价格范围为L,R那么不超过k那么i+1的价格范围就在L-k,R+k这个范围内,为了时他们尽可能的波动小,L[i+1]=max(L[i+1],L[i]-k) R[i+1]=min(R[i+1],R[i]+k),从前往后,从后往前跑2遍,剩下的就是在价格波动k的范围内所有可选的值,我们看有没有L>R,若有则不成立,没有那么打印L——R区间的任意一个数

#include 
#include 
#include 
#include 
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
#define SIS std::ios::sync_with_stdio(false)
#define space putchar(' ')
#define enter putchar('\n')
#define lson root<<1
#define rson root<<1|1
typedef pair<int,int> PII;
//const int mod=998244353;
const int N=2e6+10;
const int M=1e3+10;
const int inf=0x7f7f7f7f;
const int maxx=2e5+7;

ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}

ll lcm(ll a,ll b)
{
    return a*(b/gcd(a,b));
}

template <class T>
void read(T &x)
{
    char c;
    bool op = 0;
    while(c = getchar(), c < '0' || c > '9')
        if(c == '-')
            op = 1;
    x = c - '0';
    while(c = getchar(), c >= '0' && c <= '9')
        x = x * 10 + c - '0';
    if(op)
        x = -x;
}
template <class T>
void write(T x)
{
    if(x < 0)
        x = -x, putchar('-');
    if(x >= 10)
        write(x / 10);
    putchar('0' + x % 10);
}
ll qsm(int a,int b,int p)
{
    ll res=1%p;
    while(b)
    {
        if(b&1) res=res*a%p;
        a=1ll*a*a%p;
        b>>=1;
    }
    return res;
}
ll a[N],b[N];
int main()
{

    int t;
    scanf("%d",&t);
    while(t--)
    {
       int n;
       ll k;
       scanf("%d%lld",&n,&k);
       for(int i=1;i<=n;i++)
       {
           scanf("%lld%lld",&a[i],&b[i]);
       }
       for(int i=1;i<n;i++)
       {
           a[i+1]=max(a[i+1],a[i]-k);
           b[i+1]=min(b[i+1],b[i]+k);

       }
       for(int i=n;i>1;i--)
       {
           a[i-1]=max(a[i-1],a[i]-k);
           b[i-1]=min(b[i-1],b[i]+k);
       }
       int flag=0;
       for(int i=1;i<=n;i++)
       if(a[i]>b[i]){
        flag=1;break;
       }
       if(flag)
        printf("NO\n");
       else
       {
           printf("YES\n");
           for(int i=1;i<n;i++)
           printf("%d ",a[i]);
           printf("%d\n",a[n]);
       }


    }

    return 0;
}

你可能感兴趣的:(HDU-Fluctuation Limit(区间问题))