1547 E Air Conditioners

1500分

题意

长为n的序列,有k个空调在序列之中,每个空调占一格,每个格子都有一个温度,温度取决于公式,求每一个格子的温度多少
在这里插入图片描述

解析

  • 设置 c [ i ] c[i] c[i]代表i点的空调的温度,如果没有空调温度为INF
  • l e [ N ] , r i [ N ] le[N],ri[N] le[N],ri[N]代表只考虑自身及左边,自身及右边,此处的温度(最小值)。
  1. 根据dp递推思想,维护数组 r i ri ri只考虑每个点只受左边的空调影响,假设一个点的温度是 t [ i ] t[i] t[i] t [ i + 1 ] , t [ i + 2 ] t[i+1],t[i+2] t[i+1],t[i+2]如果不受处在 i + 1 , i + 2 i+1,i+2 i+1,i+2位置的空调影响,就是 t [ i + 1 ] = t [ i ] + 1 , t [ i + 2 ] = t [ i ] + 2 t[i+1]=t[i]+1 ,t[i+2]=t[i]+2 t[i+1]=t[i]+1t[i+2]=t[i]+2,但是其可以受自身位置的这个空调影响,因此我们和其比较取一个最小值即可。

  2. 我们用同样的思想处理右边

  3. 最后遍历数组,对这个点的左右取一个min即可

代码

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5,inf=0x3f3f3f3f;
struct node{
    int lo,te;
}r[N];
int c[N];//c[i]代表i点的空调的温度,如果没有空调温度为INF
int le[N],ri[N];//代表只考虑自身及左边,自身及右边,此处的温度。
void solve(){
    int n,k;
    cin>>n>>k;
    memset(le,0x3f,sizeof le);
    memset(ri,0x3f,sizeof ri);
    memset(c,0x3f,sizeof c);
    for(int i=0;i<k;i++){
        cin>>r[i].lo;
    }
    for(int i=0;i<k;i++){
        cin>>r[i].te;
        c[r[i].lo]=r[i].te;//转换一下
    }
    //维护一下左边
    for(int i=1;i<=n;i++){
        le[i]=min(le[i-1]+1,c[i]);
    }
    //维护一下右边
    for(int i=n;i>=0;i--){
        ri[i]=min(ri[i+1]+1,c[i]);
    }
 
    for(int i=1;i<=n;i++){
        cout<<min(ri[i],le[i])<<" ";
    }
    cout<<endl;
}
int main(){
    int t ;
    cin>>t;
    while(t--){
        solve();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值