1. 程式人生 > 其它 >Air Conditioners (模擬+感染的思想)

Air Conditioners (模擬+感染的思想)

 
On a strip of land of length nn there are kk air conditioners: the ii -th air conditioner is placed in cell a_ia 
i
​
  ( 1 \le a_i \le n1≤a 
i
​
 ≤n ). Two or more air conditioners cannot be placed in the same cell (i.e. all a_ia 
i
​
  are distinct).

Each air conditioner is characterized by one parameter: temperature. The ii -th air conditioner is
set to the temperature t_it i ​ . Example of strip of length n=6n=6 , where k=2k=2 , a=[2,5]a=[2,5] and t=[14,16]t=[14,16] .For each cell ii ( 1 \le i \le n1≤i≤n ) find it's temperature, that can be calculated by the formula $$\min_{1 \le j \le k}(t_j + |a_j - i|), </p><p>where |a\_j - i|∣a_j−i∣ denotes absolute value of the difference a\_j - ia_j−i .</p><p>In other words, the temperature in cell ii is equal to the minimum among the temperatures of air conditioners, increased by the distance from it to the cell ii .</p><p>Let
's look at an example. Consider that n=6, k=2n=6,k=2 , the first air conditioner is placed in cell a\_1=2a_1=2 and is set to the temperature t\_1=14t_1=14 and the second air conditioner is placed in cell a\_2=5a_2=5 and is set to the temperature t\_2=16t_2=16 . In that case temperatures in cells are:</p><ol> <li> temperature in
cell 11 is:\\min(14 + |2 - 1|, 16 + |5 - 1|)=\\min(14 + 1, 16 + 4)=\\min(15, 20)=15 min(14+∣21∣,16+∣51∣)= min(14+1,16+4)= min(15,20)=15 ; </li><li> temperature in cell 22 is:\\min(14 + |2 - 2|, 16 + |5 - 2|)=\\min(14 + 0, 16 + 3)=\\min(14, 19)=14 min(14+∣22∣,16+∣52∣)= min(14+0,16+3)= min(14,19)=14 ; </li><li> temperature in cell 33 is:\\min(14 + |2 - 3|, 16 + |5 - 3|)=\\min(14 + 1, 16 + 2)=\\min(15, 18)=15 min(14+∣23∣,16+∣53∣)= min(14+1,16+2)= min(15,18)=15 ; </li><li> temperature in cell 44 is:\\min(14 + |2 - 4|, 16 + |5 - 4|)=\\min(14 + 2, 16 + 1)=\\min(16, 17)=16 min(14+∣24∣,16+∣54∣)= min(14+2,16+1)= min(16,17)=16 ; </li><li> temperature in cell 55 is:\\min(14 + |2 - 5|, 16 + |5 - 5|)=\\min(14 + 3, 16 + 0)=\\min(17, 16)=16 min(14+∣25∣,16+∣55∣)= min(14+3,16+0)= min(17,16)=16 ; </li><li> temperature in cell 66 is:\\min(14 + |2 - 6|, 16 + |5 - 6|)=\\min(14 + 4, 16 + 1)=\\min(18, 17)=17 min(14+∣26∣,16+∣56∣)= min(14+4,16+1)= min(18,17)=17 . </li></ol><p>For each cell from 11 to nn$$ find the temperature in it. 輸入格式 The first line contains one integer qq ( 1 \le q \le 10^41≤q≤10 4 ) — the number of test cases in the input. Then test cases follow. Before each test case, there is an empty line. Each test case contains three lines. The first line contains two integers nn ( 1 \le n \le 3 \cdot 10^51≤n≤310 5 ) and kk ( 1 \le k \le n1≤k≤n ) — the length of the strip of land and the number of air conditioners respectively. The second line contains kk integers a_1, a_2, \ldots, a_ka 1 ​ ,a 2 ​ ,…,a k ​ ( 1 \le a_i \le n1≤a i ​ ≤n ) — positions of air conditioners on the strip of land. The third line contains kk integers t_1, t_2, \ldots, t_kt 1 ​ ,t 2 ​ ,…,t k ​ ( 1 \le t_i \le 10^91≤t i ​ ≤10 9 ) — temperatures of air conditioners. It is guaranteed that the sum of nn over all test cases does not exceed 3 \cdot 10^5310 5 . 輸出格式 For each test case output nn integers separated by space: temperatures of air in cells. 題意翻譯 有 qq 組資料,每組第一排表示有 nn 個方格和 kk 個空調,第二排是每個空調的位置 a_ia i ​ ,第三排是每個空調的溫度 t_it i ​ 。 每個空調對周圍的影響是遞減的,所以一個空調周圍的溫度是公差為 11 的遞增等差數列。如果一個方格同時被多個空調影響,那麼取最小值。空調所在的方格溫度就是空調的溫度。 輸出所有方格的溫度。 1 \le q \le 10^4 , 1 \le n \le 3 \cdot 10^5 , 1 \le k \le n , 1 \le a_i \le n , 1 \le t_i \le 10^91≤q≤10 4 ,1≤n≤310 5 ,1≤k≤n,1≤a i ​ ≤n,1≤t i ​ ≤10 9 , 保證所有 nn 的總和不超過 3 \cdot 10^5310 5 。 輸入輸出樣例 輸入 #1複製 5 6 2 2 5 14 16 10 1 7 30 5 5 3 1 4 2 5 3 1 4 2 5 7 1 1 1000000000 6 3 6 1 3 5 5 5
View Problem
#include <bits/stdc++.h> 
using namespace std;
#define ri register int
#define  M 300005

template <class G> void read(G &x)
{
    x=0;char ch=getchar();int f=0;
    while(ch<'0'||ch>'9'){f|=ch=='-';ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    x=f?-x:x;
    return ;
}

int T ,n,m;
struct dain{
    long long val,po;
    bool operator <(const dain &t)const 
    {
        return val<t.val;
    }
}a[M];
long long  val[M];
int main(){
    
    read(T);
    while(T--)
    {
        read(n);read(m);
        for(ri i=1;i<=m;i++)
        {
            read(a[i].po);
        }
        for(ri i=1;i<=m;i++) 
        {
            read(a[i].val);
        }
        sort(a+1,a+1+m);
        queue<dain>q;
        int tot=0;
        for(ri i=1;i<=m;i++)
        {
            if(q.empty())
            {
                dain b=a[i];
                if(!val[b.po])
                {
                        val[b.po]=b.val;
                        dain t;
                        if(!val[b.po+1]&&b.po+1<=n)
                        {
                            t.po=b.po+1;t.val=b.val+1;q.push(t);
                        }
                        if(!val[b.po-1]&&b.po-1>=1)
                        {
                            t.po=b.po-1;t.val=b.val+1;q.push(t);
                        }
                        tot++;
                        if(tot==n) break;
                }
                continue;
            }
            dain b=a[i];
            dain c=q.front();
            if(b.val>c.val)
            {
                while(!q.empty())
                {
                    dain c=q.front();if(c.val>b.val) break;
                    q.pop();
                    if(!val[c.po])
                    {
                        val[c.po]=c.val;
                        dain t;
                        if(!val[c.po+1]&&c.po+1<=n)
                        {
                            t.po=c.po+1;t.val=c.val+1;q.push(t);
                        }
                        if(!val[c.po-1]&&c.po-1>=1)
                        {
                            t.po=c.po-1;t.val=c.val+1;q.push(t);
                        }
                         tot++;
                         if(tot==n) break;
                    }
                    
                }
                if(tot==n) break;
                if(!val[b.po])
                {
                        val[b.po]=b.val;
                        dain t;
                        if(!val[b.po+1]&&b.po+1<=n)
                        {
                            t.po=b.po+1;t.val=b.val+1;q.push(t);
                        }
                        if(!val[b.po-1]&&b.po-1>=1)
                        {
                            t.po=b.po-1;t.val=b.val+1;q.push(t);
                        }
                        tot++;
                        if(tot==n) break;
                }
            }
            else
            {
                if(!val[b.po])
                {
                        val[b.po]=b.val;
                        dain t;
                        if(!val[b.po+1]&&b.po+1<=n)
                        {
                            t.po=b.po+1;t.val=b.val+1;q.push(t);
                        }
                        if(!val[b.po-1]&&b.po-1>=1)
                        {
                            t.po=b.po-1;t.val=b.val+1;q.push(t);
                        }
                        tot++;
                        if(tot==n) break;
                }
            }
            
        }
        if(tot<n)
        {
        //    cout<<"tes"<<endl;
            while(!q.empty())
                {
                    dain c=q.front();
                    q.pop();
                    if(!val[c.po])
                    {
                        val[c.po]=c.val;
                        dain t;
                        if(!val[c.po+1]&&c.po+1<=n)
                        {
                            t.po=c.po+1;t.val=c.val+1;q.push(t);
                        }
                        if(!val[c.po-1]&&c.po-1>=1)
                        {
                            t.po=c.po-1;t.val=c.val+1;q.push(t);
                        }
                        tot++;
                      if(tot==n) break;
                    }
    
                }
        }
        
        for(ri i=1;i<=n;i++)
        {
            printf("%lld ",val[i]);
            val[i]=0;
        }
        printf("\n");
        
        
    }
    
    
}
View Code