提出 #74626989


ソースコード 拡げる

import sys
# 提高递归深度并使用快速读入
input = sys.stdin.read
def solve():
    data = input().split()
    if not data: return
    n = int(data[0])
    q = int(data[1])
    employees = []
    ptr = 2
    for i in range(n):
        x = int(data[ptr])
        v = int(data[ptr + 1])
        employees.append((x, v))
        ptr += 2
    # 1. 坐标压缩:莫队处理的是索引,所以我们要按 X 坐标排序员工
    # 排序后,查询 [L, R] 就变成了在排好序的数组中寻找对应的索引范围
    employees.sort()
    sorted_x = [e[0] for e in employees]
    # 对评分 V 进行离散化,方便用数组 count[] 记录出现次数
    all_v = sorted(list(set(e[1] for e in employees)))
    v_map = {val: i for i, val in enumerate(all_v)}
    v_indices = [v_map[e[1]] for e in employees]
    queries = []
    for i in range(q):
        l_val = int(data[ptr])
        r_val = int(data[ptr + 1])
        ptr += 2
        # 使用二分查找将坐标范围 [L, R] 转换为数组索引范围 [ql, qr]
        import bisect
        ql = bisect.bisect_left(sorted_x, l_val)
        qr = bisect.bisect_right(sorted_x, r_val) - 1
        queries.append((ql, qr, i))
    # 2. 莫队分块排序优化
    block_size = int(n / (q ** 0.5)) if q > 0 else n
    if block_size == 0: block_size = 1
    # 奇偶块排序优化:减小右指针回跳的开销
    queries.sort(key=lambda x: (x[0] // block_size,
                                x[1] if (x[0] // block_size) % 2 == 0 else -x[1]))
    # 3. 莫队核心转移
    ans = [0] * q
    count = [0] * len(all_v)
    current_m = 0  # 当前区间内的总人数
    current_pairs = 0  # 当前区间内评分相同的员工对数: sum(c_i * (c_i - 1) / 2)
    def add(idx):
        nonlocal current_m, current_pairs
        v = v_indices[idx]
        # 增加一个人,评分相同对数的增量是原来的 count[v]
        current_pairs += count[v]
        count[v] += 1
        current_m += 1
    def remove(idx):
        nonlocal current_m, current_pairs
        v = v_indices[idx]
        count[v] -= 1
        current_pairs -= count[v]
        current_m -= 1
    cur_l, cur_r = 0, -1
    for ql, qr, qid in queries:
        if ql > qr:  # 处理空区间
            ans[qid] = 0
            continue
        while cur_r < qr:
            cur_r += 1
            add(cur_r)
        while cur_l > ql:
            cur_l -= 1
            add(cur_l)
        while cur_r > qr:
            remove(cur_r)
            cur_r -= 1
        while cur_l < ql:
            remove(cur_l)
            cur_l += 1
        # 根据推导公式计算结果
        # RankSum = M + M*(M-1)/2 - current_pairs
        res = current_m + (current_m * (current_m - 1) // 2) - current_pairs
        ans[qid] = res
    # 4. 输出结果
    sys.stdout.write('\n'.join(map(str, ans)) + '\n')
if __name__ == "__main__":
    solve()

提出情報

提出日時
問題 E - 社内ランキング
ユーザ hcx_sgy
言語 Python (PyPy 3.11-v7.3.20)
得点 466
コード長 2893 Byte
結果 AC
実行時間 675 ms
メモリ 175488 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 466 / 466
結果
AC × 5
AC × 87
セット名 テストケース
Sample sample01.txt, sample02.txt, sample03.txt, sample04.txt, sample05.txt
All sample01.txt, sample02.txt, sample03.txt, sample04.txt, sample05.txt, in01.txt, in02.txt, in03.txt, in04.txt, in05.txt, in06.txt, in07.txt, in08.txt, in09.txt, in10.txt, in11.txt, in12.txt, in13.txt, in14.txt, in15.txt, in16.txt, in17.txt, in18.txt, in19.txt, in20.txt, in21.txt, in22.txt, in23.txt, in24.txt, in25.txt, in26.txt, in27.txt, in28.txt, in29.txt, in30.txt, in31.txt, in32.txt, in33.txt, in34.txt, in35.txt, in36.txt, in37.txt, in38.txt, in39.txt, in40.txt, in41.txt, in42.txt, in43.txt, in44.txt, in45.txt, in46.txt, in47.txt, in48.txt, in49.txt, in50.txt, in51.txt, in52.txt, in53.txt, in54.txt, in55.txt, in56.txt, in57.txt, in58.txt, in59.txt, in60.txt, in61.txt, in62.txt, in63.txt, in64.txt, in65.txt, in66.txt, in67.txt, in68.txt, in69.txt, in70.txt, in71.txt, in72.txt, in73.txt, in74.txt, in75.txt, in76.txt, in77.txt, in78.txt, in79.txt, in80.txt, in81.txt, in82.txt
ケース名 結果 実行時間 メモリ
in01.txt AC 51 ms 80652 KiB
in02.txt AC 51 ms 81212 KiB
in03.txt AC 51 ms 81060 KiB
in04.txt AC 51 ms 81120 KiB
in05.txt AC 51 ms 80888 KiB
in06.txt AC 483 ms 175488 KiB
in07.txt AC 558 ms 174088 KiB
in08.txt AC 582 ms 175452 KiB
in09.txt AC 166 ms 169304 KiB
in10.txt AC 391 ms 175348 KiB
in11.txt AC 675 ms 175360 KiB
in12.txt AC 584 ms 175452 KiB
in13.txt AC 237 ms 156788 KiB
in14.txt AC 199 ms 142244 KiB
in15.txt AC 116 ms 154460 KiB
in16.txt AC 557 ms 169348 KiB
in17.txt AC 287 ms 170620 KiB
in18.txt AC 193 ms 170716 KiB
in19.txt AC 568 ms 172952 KiB
in20.txt AC 54 ms 81028 KiB
in21.txt AC 191 ms 168540 KiB
in22.txt AC 161 ms 164876 KiB
in23.txt AC 478 ms 165788 KiB
in24.txt AC 490 ms 167028 KiB
in25.txt AC 484 ms 167176 KiB
in26.txt AC 470 ms 167904 KiB
in27.txt AC 484 ms 172860 KiB
in28.txt AC 229 ms 155892 KiB
in29.txt AC 201 ms 142040 KiB
in30.txt AC 369 ms 167816 KiB
in31.txt AC 540 ms 169820 KiB
in32.txt AC 53 ms 81072 KiB
in33.txt AC 56 ms 88008 KiB
in34.txt AC 51 ms 80940 KiB
in35.txt AC 51 ms 81192 KiB
in36.txt AC 250 ms 164872 KiB
in37.txt AC 498 ms 165936 KiB
in38.txt AC 53 ms 81212 KiB
in39.txt AC 76 ms 103520 KiB
in40.txt AC 51 ms 81064 KiB
in41.txt AC 53 ms 81828 KiB
in42.txt AC 52 ms 81272 KiB
in43.txt AC 53 ms 81988 KiB
in44.txt AC 51 ms 81196 KiB
in45.txt AC 77 ms 104156 KiB
in46.txt AC 297 ms 173192 KiB
in47.txt AC 256 ms 165008 KiB
in48.txt AC 528 ms 169124 KiB
in49.txt AC 566 ms 165964 KiB
in50.txt AC 507 ms 166156 KiB
in51.txt AC 344 ms 164616 KiB
in52.txt AC 165 ms 169888 KiB
in53.txt AC 477 ms 174012 KiB
in54.txt AC 291 ms 168308 KiB
in55.txt AC 333 ms 168476 KiB
in56.txt AC 333 ms 167176 KiB
in57.txt AC 340 ms 168328 KiB
in58.txt AC 286 ms 166428 KiB
in59.txt AC 382 ms 165540 KiB
in60.txt AC 527 ms 166704 KiB
in61.txt AC 438 ms 150552 KiB
in62.txt AC 652 ms 169296 KiB
in63.txt AC 608 ms 167176 KiB
in64.txt AC 92 ms 140548 KiB
in65.txt AC 91 ms 140780 KiB
in66.txt AC 53 ms 80948 KiB
in67.txt AC 53 ms 81156 KiB
in68.txt AC 52 ms 80976 KiB
in69.txt AC 52 ms 80976 KiB
in70.txt AC 52 ms 80976 KiB
in71.txt AC 51 ms 80652 KiB
in72.txt AC 52 ms 81068 KiB
in73.txt AC 52 ms 81196 KiB
in74.txt AC 113 ms 153240 KiB
in75.txt AC 113 ms 153460 KiB
in76.txt AC 53 ms 81012 KiB
in77.txt AC 55 ms 80940 KiB
in78.txt AC 53 ms 81240 KiB
in79.txt AC 53 ms 81400 KiB
in80.txt AC 52 ms 80948 KiB
in81.txt AC 440 ms 166400 KiB
in82.txt AC 454 ms 167232 KiB
sample01.txt AC 53 ms 81192 KiB
sample02.txt AC 52 ms 81120 KiB
sample03.txt AC 52 ms 81112 KiB
sample04.txt AC 52 ms 81068 KiB
sample05.txt AC 51 ms 80508 KiB