愚直にシミュレーションすると になりTLEしていまいます。Fenwick Treeを用いて転倒数を高速に求めても になり厳しいです。
転倒数は左りに整数 があり、右に整数 があるようなペア で影響されます。
例として ではペア がそれぞれ 1, 2, 2, 1個あります。
そのようなペアは の100通りしかありません。これらのペアの中で を満足するペアの個数が転倒数となります。上の数列では の個数 2 が転倒数となります。
また、クエリごとに変化した数列のペアも100種類しかないです。また、ペアは から に変化します。
よってクエリごとに数列の要素の種類数を とすると の計算量で転倒数を計算できます。
最初にペアの個数を計算するのに かかるため、この問題が で解けました。
実装例(c++)
#include <bits/stdc++.h> using namespace std; using ll = long long; int main() { int n, q; cin >> n >> q; vector<int> p(n); for(int i = 0; i < n; i++) cin >> p[i]; vector<vector<int>> v(10, vector<int>(10, 0)); for(int i = 0; i < n; i++) { for(int j = i + 1; j < n; j++) { v[p[i]][p[j]]++; } } while(q--) { vector<int> t(10); for(int i = 0; i < 10; i++) cin >> t[i]; int ans = 0; for(int i = 0; i < 10; i++) { for(int j = 0; j < 10; j++) { if(t[i] > t[j]) ans += v[i][j]; } } cout << ans << '\n'; } }