提出 #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 |
| 結果 |
|
|
| セット名 |
テストケース |
| 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 |