Submission #1269357

#TimeUsernameProblemLanguageResultExecution timeMemory
1269357PagodePaivaExamination (JOI19_examination)Pypy 3
100 / 100
778 ms199680 KiB
import sys
def main():
    data = sys.stdin.readline().split()
    if not data:
        return
    N = int(data[0]); Q = int(data[1])
    S = [0]*N
    T = [0]*N
    for i in range(N):
        si, ti = sys.stdin.readline().split()
        S[i] = int(si); T[i] = int(ti)
    X = [0]*Q; Y = [0]*Q; Z = [0]*Q
    for j in range(Q):
        xj, yj, zj = sys.stdin.readline().split()
        X[j] = int(xj); Y[j] = int(yj); Z[j] = int(zj)
    P = [S[i] + T[i] for i in range(N)]
    # compress P and Z
    p_vals = set(P)
    for v in Z:
        p_vals.add(v)
    p_list = sorted(p_vals)
    p_map = {v:i+1 for i,v in enumerate(p_list)}
    # compress T and Y
    t_vals = set(T)
    for v in Y:
        t_vals.add(v)
    t_list = sorted(t_vals)
    t_map = {v:i+1 for i,v in enumerate(t_list)}
    # sort candidates by S descending and build list
    cand = list(range(N))
    cand.sort(key=lambda i: S[i], reverse=True)
    cand_list = [(S[i], t_map[T[i]], p_map[P[i]]) for i in cand]
    # build query lists
    list_PQ = []
    list_TQ = []
    for j in range(Q):
        Xj = X[j]; Yj = Y[j]; Zj = Z[j]
        K = Zj - Yj
        x2 = K + 1
        if x2 <= Xj:
            # sum redundant
            list_TQ.append((Xj, t_map[Yj], j, 1))
        else:
            # need full formula
            dz = p_map[Zj]
            list_PQ.append((Xj, dz, j, 1))
            list_PQ.append((x2, dz, j, -1))
            list_TQ.append((x2, t_map[Yj], j, 1))
    # process P-dimension queries (C1 - C2)
    ansP = [0]*Q
    list_PQ.sort(key=lambda x: x[0], reverse=True)
    bitP_size = len(p_list)
    bitP = [0] * (bitP_size + 1)
    total = 0
    pos = 0
    Ncand = N
    for S0, dz, j, mul in list_PQ:
        while pos < Ncand and cand_list[pos][0] >= S0:
            _, _, p_idx = cand_list[pos]
            i = p_idx
            while i <= bitP_size:
                bitP[i] += 1
                i += i & -i
            total += 1
            pos += 1
        # count P < Zj
        i = dz - 1
        s = 0
        while i > 0:
            s += bitP[i]
            i -= i & -i
        ansP[j] += mul * (total - s)
    # process T-dimension queries (rectangle or C3)
    ansT = [0]*Q
    list_TQ.sort(key=lambda x: x[0], reverse=True)
    bitT_size = len(t_list)
    bitT = [0] * (bitT_size + 1)
    total = 0
    pos = 0
    for S0, dy, j, mul in list_TQ:
        while pos < Ncand and cand_list[pos][0] >= S0:
            _, t_idx, _ = cand_list[pos]
            i = t_idx
            while i <= bitT_size:
                bitT[i] += 1
                i += i & -i
            total += 1
            pos += 1
        i = dy - 1
        s = 0
        while i > 0:
            s += bitT[i]
            i -= i & -i
        ansT[j] += mul * (total - s)
    # output final answers
    out = sys.stdout.write
    for j in range(Q):
        out(str(ansP[j] + ansT[j]) + "\n")

if __name__ == "__main__":
    main()

Compilation message (stdout)

Compiling 'examination.py'...

=======
  adding: __main__.pyc (deflated 51%)

=======
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...