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;
}