考えたこと
(x, y)で表現?実装
一旦中断
ネットで解説を探すともっとシンプルにやってそうな感じ
スワップされたところを記録しておいて、ソートの時にはそこだけを確認すれば良い
ほんとにそうなのかいまいち自信が持てないけどその方針で実装してみよう
サンプルは通ったがジャッジは11TLE
一度立てたフラグを消してない
消すとサンプルが通らなくなる
スワップの結果、手前に転倒が発生することがある
スワップの際(ソートの時に行われるものも含め)転倒しうるところにフラグを立てる
ソートはフラグを消しながら行う
これでACした
AC: python
def solve(N, Q, QS):
values = list(range(1, N + 1))
ft = FenwickTree(N)
def swap(i):
values[i], values[i + 1] = values[i + 1], values[i]
if i > 0:
ft.set(i - 1, 1)
ft.set(i, 1)
if i < N - 1:
ft.set(i + 1, 1)
for t, x, y in QS:
if t == 1:
x -= 1
# swap query
swap(x)
else:
x -= 1
y -= 1
# sort query
s = ft.sum(x) + 1
pos = ft.bisect(s) - 1
while pos < y:
ft.set(pos, 0)
while pos >= x and values[pos] > values[pos + 1]:
swap(pos)
pos -= 1
pos = ft.bisect(s) - 1
return values