• 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
  • 相关阅读:
    每日日报2020.9.30 1905
    每日日报2020.10.7 1905
    每日日报2020.10.2 1905
    每日日报2020.9.28 1905
    程序员修炼之道:从小工到专家 九月读书心得 1905
    每日日报2020.9.27 1905
    每日日报2020.9.29 1905
    每日日报2020.10.6 1905
    每日日报2020.10.5 1905
    每日总结2
  • 原文地址:https://www.cnblogs.com/Lamboofhome/p/15990681.html
Copyright © 2020-2023  润新知