Codeforces Round #731 (Div. 3) E. Air Conditioners
Posted yueshehanjiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #731 (Div. 3) E. Air Conditioners相关的知识,希望对你有一定的参考价值。
被hack了
请移步至我队友写的题解
点我
E. Air Conditioners
题意:
给定q组样例
(q <= 1e4)
每组样例给
n , k
x1 , x2 , ..... xk
t1 , t2 , ..... tk
( x <= 3e5 , t <= 1e9 )
( q组样例n的总和 <= 3e5)
n表示数轴上的n个点
k表一共有k个冰箱
x,t 表示该冰箱在数轴上的位置,温度为t
求对数轴上的每一个i [1 <= i <= n ]
min(
t
j
t_j
tj +
∣
x
j
−
i
∣
\\vert {x_j-i} \\vert
∣xj−i∣ ) [ 1 <= j <= k ] 的值
思路:
我们可以发现这个式子求的是
每个点与该冰箱的距离+该冰箱的温度
温度是不变的 于是距离可以用bfs来求
所以可以跑多起点bfs
(第一个样例的答案已经很明显在给你提示了)
如果跑的过程中发现这个点的答案可以更小
就更新,否则退出
时间复杂度:O ?
#include<bits/stdc++.h>
#define fer(i,a,b) for(re i = a ; i <= b ; ++ i)
#define re register int
#define pll pair<int,int>
#define x first
#define y second
#define sf(x) scanf("%d",&x)
#define sfl(x) scanf("%lld",&x)
typedef long long ll ;
using namespace std;
const int N = 1e6 + 10 , M = 1010 , inf = 0x3f3f3f3f , mod = 1e9 + 7 ;
int t ;
int n , k ;
pll q[N] ; // q[i].x 表示温度 q[i].y 表示位置
int ans[N] ; // 最后的答案数组
int main()
{
cin >> t ;
while(t--)
{
cin >> n >> k ;
fer(i,1,n) ans[i] = inf ;
fer(i,1,k) sf(q[i].y) ;
fer(i,1,k) sf(q[i].x) ;
queue<pll> f ;
for(int i = 1 ; i <= k ; i ++)
{
f.push({q[i].y,q[i].x}) ;
// 一维表示位置,二维表示温度
}
while(f.size())
{
auto t = f.front() ;
f.pop() ;
// 如果当前点的权值小于这个点的答案 就更新
if(t.y <= ans[t.x])
{
ans[t.x] = t.y ; // 更新答案
if(t.x - 1 >= 1) // 如果可以向数轴左边搜
{
f.push({t.x - 1 , t.y + 1}) ;
// 位置 - 1 ,权值 + 1
}
if(t.x + 1 <= n) // 如果可以向数轴右边搜
{
f.push({t.x + 1 , t.y + 1}) ;
// 位置 + 1 ,权值 + 1
}
}
}
for(int i = 1 ; i <= n ; i ++) cout << ans[i] << " " ;
cout << "\\n" ;
}
return 0;
}
以上是关于Codeforces Round #731 (Div. 3) E. Air Conditioners的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #731 (Div. 3)
Codeforces Round #731 (Div. 3) E题解
Codeforces Round #731 (Div. 3) B. Alphabetical Strings
Codeforces Round #731 (Div. 3) E. Air Conditioners
Codeforces Round #731 (Div. 3) F. Array Stabilization (GCD version)
Codeforces Round #731 (Div. 3) F. Array Stabilization (GCD version)