CF.1457E Air Conditioners

1457E Air Conditioners

链接:https://codeforces.com/problemset/problem/1547/E

题意:
给定一个序列,某些位置\(a\)上有空调,设置温度\(t\),根据公式\(temptrue[i] = min_{1 \leq j \leq k}(t_j + |a_j - i|)\) 算出序列每一个元素的温度。

题目分析:设\(a[i]\)表示每个空调的位置,\(lf\)表示只考虑左边空调影响下的最小温度,\(rt\)表示只考虑右边空调影响下的最小温度,根据dp递推,最后每个位置的温度就是\(min(lf_i, rt_i)\)

#include <iostream>
#include <cstring>
using namespace std;

const int N = 300010;

int a[N]; // 空调位置
int lf[N], rt[N]; // 只考虑左、右边时的min(tempetrue)

int main () {
    int q; cin >> q;
    while (q -- ) {
        memset(lf, 0x3f, sizeof lf);
        memset(rt, 0x3f, sizeof rt);
        int n, k; cin >> n >> k;
        for (int i = 1; i <= k; i++) cin >> a[i];
        for (int i = 1, temptrue; i <= k; i++) {
            cin >> temptrue;
            lf[a[i]] = rt[a[i]] = temptrue;
        }

        for (int i = 1; i <= n; i++) lf[i] = min(lf[i-1]+1, lf[i]);
        for (int i = n; i >= 1; i--) rt[i] = min(rt[i+1]+1, rt[i]);

        for (int i = 1; i <= n; i++) cout << min(lf[i], rt[i]) << ' ';
        cout << endl;
    }
    return 0;
}
posted @ 2021-07-21 18:05  Horb7  阅读(40)  评论(0编辑  收藏  举报