提出 #40374230


ソースコード 拡げる

import sys
inputs = sys.stdin.readline
#https://qiita.com/hyouchun/items/55877339a682e018bf1b
"""Mo's Algorithm

・使い方
mo=Mo(A,queries): インスタンス生成
ans=mo.ans: 各クエリに対する答えが順番に入ってるリスト
MoStatusの中のTODOのところは、問題ごとに変える

参考URL(ありがとうございます!)
ei3333さんの記事【https://ei1333.hateblo.jp/entry/2017/09/11/211011】
Nyaanさんの記事【https://nyaannyaan.github.io/library/misc/mo.hpp.html】
"""

import math
from operator import itemgetter

class MoStatus():
    def __init__(self, max_element):
        self.cnt = [0] * (max_element + 1)
        self.val = 0

    def add(self, element):
        self.cnt[element] += 1
        if self.cnt[element]%2==0:
            self.val+=1


    def discard(self, element):
        if self.cnt[element]%2==0:
            self.val-=1
        self.cnt[element] -= 1

class Mo():
    def __init__(self, lis, init_queries):
        self.N = len(lis)
        self.lis = lis

        self.Q = len(init_queries)
        self.max_r = -1
        self.init_queries = []
        for qi, query in enumerate(init_queries):
            l, r = query
            self.init_queries.append((l, r, qi))
            if self.max_r < r:
                self.max_r = r

        self.status = MoStatus(max_element=max(self.lis))

        self.section_width = None
        self.separate_cnt = None
        self.separated_queries = None
        self.separated_queries_generator()

        self.ans = [0] * self.Q
        self.solve()

    def separated_queries_generator(self):
        self.section_width = int(
            math.sqrt(3) * self.max_r / math.sqrt(2 * self.Q)) + 1
        self.separate_cnt = (
                                    self.max_r + self.section_width - 1) // self.section_width
        self.separated_queries = [[] for _ in range(self.separate_cnt + 1)]
        for query in self.init_queries:
            l, r, qi = query
            idx = l // self.section_width
            self.separated_queries[idx].append(query)
        for i in range(self.separate_cnt):
            self.separated_queries[i].sort(key=itemgetter(1), reverse=i % 2)

    def solve(self):
        prev_l, prev_r = 0, -1
        for queries_list in self.separated_queries:
            for query in queries_list:
                nl, nr, qi = query
                if nl < prev_l:
                    for i in range(nl, prev_l):
                        element = self.lis[i]
                        self.status.add(element)
                else:
                    for i in range(prev_l, nl):
                        element = self.lis[i]
                        self.status.discard(element)
                if prev_r < nr:
                    for i in range(nr, prev_r, -1):
                        element = self.lis[i]
                        self.status.add(element)
                else:
                    for i in range(prev_r, nr, -1):
                        element = self.lis[i]
                        self.status.discard(element)
                prev_l, prev_r = nl, nr
                self.ans[qi] = self.status.val

def main():
    N = int(inputs())
    A = list(map(int,inputs().split()))
    Q = int(inputs())
    queries = []
    for _ in range(Q):
        l, r = map(int, inputs().split())
        queries.append((l - 1, r - 1))
    mo = Mo(A,queries)
    print(*mo.ans)#横並びの出力でもACする
if __name__ == "__main__":
    main()

提出情報

提出日時
問題 G - Range Pairing Query
ユーザ H20
言語 PyPy3 (7.3.0)
得点 600
コード長 3597 Byte
結果 AC
実行時間 3612 ms
メモリ 314116 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 600 / 600
結果
AC × 1
AC × 30
セット名 テストケース
Sample sample_01.txt
All pair_01.txt, pair_02.txt, pair_03.txt, pair_04.txt, sample_01.txt, test_01.txt, test_02.txt, test_03.txt, test_04.txt, test_05.txt, test_06.txt, test_07.txt, test_08.txt, test_09.txt, test_10.txt, test_11.txt, test_12.txt, test_13.txt, test_14.txt, test_15.txt, test_16.txt, test_17.txt, test_18.txt, test_19.txt, test_20.txt, test_21.txt, test_22.txt, test_23.txt, test_24.txt, test_25.txt
ケース名 結果 実行時間 メモリ
pair_01.txt AC 3328 ms 307596 KiB
pair_02.txt AC 3352 ms 305248 KiB
pair_03.txt AC 3310 ms 307256 KiB
pair_04.txt AC 3331 ms 307628 KiB
sample_01.txt AC 64 ms 63060 KiB
test_01.txt AC 53 ms 63000 KiB
test_02.txt AC 1707 ms 230136 KiB
test_03.txt AC 2301 ms 238080 KiB
test_04.txt AC 576 ms 102680 KiB
test_05.txt AC 1763 ms 241192 KiB
test_06.txt AC 735 ms 125792 KiB
test_07.txt AC 283 ms 85084 KiB
test_08.txt AC 670 ms 154448 KiB
test_09.txt AC 211 ms 81924 KiB
test_10.txt AC 2483 ms 314116 KiB
test_11.txt AC 2982 ms 307208 KiB
test_12.txt AC 3589 ms 307712 KiB
test_13.txt AC 3529 ms 307360 KiB
test_14.txt AC 3560 ms 307484 KiB
test_15.txt AC 3080 ms 305252 KiB
test_16.txt AC 3257 ms 307192 KiB
test_17.txt AC 3556 ms 304952 KiB
test_18.txt AC 3612 ms 307576 KiB
test_19.txt AC 3437 ms 305480 KiB
test_20.txt AC 3173 ms 307456 KiB
test_21.txt AC 2997 ms 306884 KiB
test_22.txt AC 3527 ms 305148 KiB
test_23.txt AC 3555 ms 307536 KiB
test_24.txt AC 3537 ms 307292 KiB
test_25.txt AC 2608 ms 307060 KiB