链接 Air Conditioners
题意
有n个格子排成一行,编号1到n,其中有一些格子中有“空调”和温度t,其他格子的温度由有空调的格子得到;
假设有空调的格子为i,则第j个格子的温度为t + |i - j|;
求出每个格子的最低温度;
思路
可以从题意中得出,每个格子的温度其实都是由相邻格子提供;
左右各遍历一遍所有格子就是答案;
至于为什么如此,可以想象一下,左遍历一遍可以得到有“空调
”格子右边的格子的温度,最后一个“空调”右边的格子的温度应该是已经确定的最小的(可以手推一下),我们在进行左遍历,就可以确定中间格子和最左边格子的温度;过于啰嗦了,可以自己手推一下@_@
AC代码
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <string>
#include <algorithm>
#include <queue>
#include <utility>
#include <stack>
#include <map>
#include <vector>
#include <set>
#include <iomanip>
#define hz020 return
#define mes memset
#define mec memcpy
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll>pii;
const int N = 300010;
const int null = 0x3f3f3f3f,INF = 1e9;
const ll mod = 998244353;
int T;
int n,k;
int a[N];
ll t[N];
ll gcd(ll a,ll b)
{
return b ? gcd(b,a % b) : a;
}
int main()
{
cin >> T;
while(T --)
{
cin >> n >> k;
for(int i = 0;i <= n + 1;i ++) t[i] = 100000000000;
for(int i = 1;i <= k;i ++) cin >> a[i];
for(int i = 1;i <= k;i ++)
{
ll x;
cin >> x;
t[a[i]] = x;
}
for(int i = 1;i <= n;i ++) t[i] = min(t[i],t[i - 1] + 1);
for(int i = n;i >= 1;i --) t[i] = min(t[i],t[i + 1] + 1);
for(int i = 1;i <= n;i ++) cout << t[i] << " ";
puts("");
}
hz020 0;
}