Codeforces Round #731 (Div. 3) E题解

Posted 筱翼深凉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #731 (Div. 3) E题解相关的知识,希望对你有一定的参考价值。

传送门

题意

给定一个长度为\\(n\\)的一维区间,区间里有\\(k\\)个空调,不存在重合的情况。每个空调能在其位置\\(a\\)上造成温度\\(t\\),每远离该位置\\(1\\)个单位距离,温度上升\\(1\\)。每个点的温度是所有的空调在这里造成的温度的最小值。

思路

易知往右边的位置,是左边的空调的最小值加上\\(1\\),右边的空调最小值减去\\(1\\),因此我们考虑:

  • \\(a[j] < i\\),此时往右移时,是所有\\(a[j] < i\\)的空调的最小值加上\\(1\\)
  • \\(a[j] > i\\),此时往右移时,是所有\\(a[j] > i\\)的空调的最小值加上\\(1\\)
  • \\(a[j] = i\\),此时往右移时,当前位置的空调本来在左边,但是变成了右边,所以右边的最小值需要取一个\\(min\\),右边同时要取移除这个空调之后的最小值

综上所述,我们可以使用单调队列维护所有空调的最小值,然后从左到右遍历每一个位置,遇到一个空调,就将其从队列中弹出,并维护左边的最小值,答案就是左边和右边的值的最小值。

代码

int n, k;
struct CON
{
    int a, t;
    bool operator < (const CON &x) {return a < x.a;}
}c[N];
PII b[N];
pair<bool, int> st[N];
int res[N];
int q[N];
 
int main()
{
    int T;
    cin >> T;
    while (T --  ) 
    {
        cin >> n >> k;
        for (int i = 1; i <= k; i ++ ) cin >> c[i].a;
        for (int i = 1; i <= k; i ++ ) cin >> c[i].t;
 
        sort(c + 1, c + 1 + k);
        for (int i = 1; i <= k; i ++ ) st[c[i].a] = {true, i};
 
        int l = 0x3f3f3f3f;
 
        int hh = 0, tt = -1;
        for (int i = 1; i <= k; i ++ ) 
        {
            while (hh <= tt && c[q[tt]].t + c[q[tt]].a - 1 > c[i].t + c[i].a - 1) tt -- ;
            q[++ tt] = i;
        }
 
        for (int i = 1; i <= n; i ++ )
        {
            if (st[i].x) 
            {
                int id = st[i].y;
                l = min(l, c[id].t + c[id].a - i);
                if (id >= q[hh]) hh ++ ;
                st[i].x = false;
            }
            if (hh <= tt) 
            {
                int id = q[hh];
                int r = c[id].t + c[id].a - i;
                res[i] = min(l, r);
            }
            else res[i] = l;
            l ++ ;
        }
 
        for (int i = 1; i <= n; i ++ ) cout << res[i] << \' \';
        cout << endl;
    }
    
    return 0;
}

以上是关于Codeforces Round #731 (Div. 3) E题解的主要内容,如果未能解决你的问题,请参考以下文章

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)