给定一个序列 aa,对 奇数下标 和 偶数下标 的元素分别进行排序,如何判断排序之后的序列是不是非严格递增的?

比如序列 a=[1,4,1,3,5]a=[1,4,1,3,5],排序后为 a=[1,3,1,4,5]a=[1,3,1,4,5] 不合法。

比如序列 a=[3,4,1,3,5]a=[3,4,1,3,5],排序后为 a=[1,3,3,4,5]a=[1,3,3,4,5] 合法。

aa 的长度 nn 满足 n105n \le 10^5,多组询问,每次询问改 aa 中的一个数,询问数 mm 满足 m3105m \le 3*10^5ai106a_i \le 10^6

3 条评论

  • @ 2021-11-9 11:28:09

    现在已经会用分块卡了。大概就是在所有偶数位上数的位置+1,在所有奇数位数的位置-1,然后判定所有的前缀和是否为0或1.

    然而只有80pts

    inline void add(int k, int tp)
    {
        int value = tp ? 1 : -1;
        //printf("%d\n", value);
        int startBlock = (k - 1) / blksize + 1;
        mn[startBlock] = 0x3f3f3f3f;
        mx[startBlock] = -0x3f3f3f3f;
        for (RI i = (startBlock - 1) * blksize + 1; i <= startBlock * blksize; ++i)
        {
            if (i >= k)
                val[i] += value;
            mn[startBlock] = min(val[i] + tag[startBlock], mn[startBlock]);
            mx[startBlock] = max(val[i] + tag[startBlock], mx[startBlock]);
        }
        for (RI i(startBlock + 1), e(blknum); i <= e; ++i)
        {
            tag[i] += value;
            mn[i] += value;
            mx[i] += value;
        }
    }
    
    inline bool judge()
    {
        for (RI i = 1; i <= blknum; ++i)
        {
            if (mn[i] < 0)
                return false;
            if (mx[i] > 1)
                return false;
        }
        return true;
    }
    
    int main()
    {
        freopen("sort.in", "r", stdin);
        freopen("sort.out", "w", stdout);
        F_IO.read(n);
        F_IO.read(m);
        blksize = 1005;
        blknum = (MAXN - 1) / blksize + 1;
        for (RI i(1), e(blknum); i <= e; ++i)
        {
            tag[i] = 0;
        }
        for (RI i(1), e(n); i <= e; ++i)
        {
            F_IO.read(a[i]);
            add(a[i], i & 1);
        }
        RI x, y;
        while (m--)
        {
            F_IO.read(x);
            F_IO.read(y);
            add(a[x], (x & 1) ^ 1);
            a[x] = y;
            add(a[x], (x & 1));
            puts(judge() ? "Yes" : "No");
        }
        F_IO.buf_flush();
        return 0;
    }
    

    求调

    • @ 2021-11-7 20:40:32

      数据规模不给怎么选算法(

      • @ 2021-11-7 20:05:23

        看起来直接排序然后模拟会 T……

        不知道诶……我想想

        • 1