You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

排列组合查询算法优化:如何降低O(mn+qm)的时间复杂度?

排列复合查询的优化问题

问题描述

给定数组 $a_1, \dots, a_n$,每个元素是长度为 $m$ 的排列。两个排列 $x$ 和 $y$ 的复合操作定义为 $z = x * y$,其中 $z(i) = y(x(i))$。给定 $q$ 个查询,每个查询包含两个整数 $1 \leq l \leq r \leq n$,令 $b = ((\dots((a_l*a_{l+1})a_{l+2})\dots)a_r)$,查询答案为 $\text{sum} = 1b(1)+\dots+mb(m)$,需要实现快速响应查询的程序。

约束条件

  • $1 \leq n,m \leq 10^5$,且 $1 \leq nm \leq 210^5$
  • $1 \leq q \leq 2*10^5$
  • 所有测试用例的 $n \cdot m$ 和 $q$ 之和不超过 $2*10^5$
  • Python 时间限制 6 秒,C++ 为 2 秒,内存限制 512MB

当前解法与问题

我采用前缀排列数组与前缀排列逆数组的思路实现,但代码时间复杂度为 $O(mn+qm)$,运行速度过慢,请问如何优化?

我的Python代码

t = int(input())
for i in range (t):
    n,m = list(map(int,input().split()))
    prefix_mass = []
    inv_mass = []
    s = list(range(0, m))
    s_ = list(range(0, m))
    for j in range (n):
        e = list(map(int,input().split()))
        new_s = [0] * m
        new_s_ = [0] * m
        a_ = [0] * m
        for k in range (m):
            new_s[k] = e[s[k]] - 1
            new_s_[e[k] - 1] = s_[k]
        s = new_s
        s_ = new_s_
        prefix_mass.append(s)
        inv_mass.append(s_)
    q = int(input())
    for j in range(q):
        l, r = list(map(int,input().split()))
        l -= 1
        r -= 1
        if l == 0:
            ans = 0
            s = prefix_mass[r]
            for k in range(m):
                ans += (s[k] + 1) * (k + 1)
            if (i == t - 1 and j == q - 1):
                print(ans, end="")
            else: print(ans)
        else:
            ans = 0
            s = prefix_mass[r]
            s_ = inv_mass[l - 1]
            for k in range(m):
                ans += (k + 1) * (s[s_[k]] + 1)
            if (i == t - 1 and j == q - 1):
                print(ans, end="")
            else: print(ans)

输入输出示例

输入

1
4 3
3 2 1
1 3 2
1 2 3
2 3 1
5
1 1
1 4
3 4
3 3
1 3

输出

10
11
11
14
11

内容的提问来源于stack exchange,提问作者Arthur_Kitsuragi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 03:50:01