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 xji ) [ 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)