/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 29ms 3.02 MiB
#2 Accepted 14ms 3.148 MiB
#3 Accepted 14ms 3.02 MiB
#4 Accepted 14ms 3.109 MiB
#5 Accepted 16ms 2.922 MiB
#6 Accepted 17ms 3.086 MiB
#7 Accepted 18ms 2.977 MiB
#8 Accepted 16ms 3.113 MiB
#9 Accepted 16ms 3.035 MiB
#10 Accepted 15ms 3.105 MiB
#11 Accepted 15ms 3.016 MiB
#12 Accepted 17ms 2.984 MiB
#13 Accepted 17ms 3.105 MiB
#14 Accepted 17ms 2.941 MiB
#15 Accepted 38ms 3.086 MiB
#16 Accepted 16ms 3.008 MiB
#17 Accepted 16ms 3.078 MiB
#18 Accepted 16ms 3.066 MiB
#19 Accepted 14ms 3.02 MiB
#20 Accepted 14ms 3.02 MiB
#21 Accepted 14ms 3.02 MiB
#22 Accepted 14ms 2.945 MiB
#23 Accepted 14ms 3.129 MiB
#24 Accepted 14ms 3.164 MiB
#25 Accepted 14ms 3.062 MiB
#26 Accepted 14ms 2.93 MiB
#27 Accepted 14ms 3.066 MiB
#28 Accepted 14ms 3.137 MiB
#29 Accepted 14ms 3.062 MiB
#30 Accepted 16ms 2.957 MiB
#31 Accepted 17ms 3.113 MiB
#32 Accepted 18ms 2.988 MiB
#33 Accepted 15ms 3.145 MiB
#34 Accepted 14ms 3.031 MiB
#35 Accepted 16ms 2.988 MiB
#36 Accepted 16ms 3.137 MiB
#37 Accepted 17ms 3.113 MiB
#38 Accepted 18ms 2.988 MiB
#39 Accepted 18ms 3.105 MiB
#40 Accepted 21ms 3.074 MiB
#41 Accepted 21ms 3.023 MiB
#42 Accepted 38ms 3.078 MiB
#43 Accepted 15ms 3.066 MiB
#44 Accepted 14ms 3.02 MiB
#45 Accepted 14ms 3.098 MiB
#46 Accepted 38ms 2.926 MiB
#47 Accepted 16ms 3.02 MiB
#48 Accepted 16ms 2.91 MiB
#49 Accepted 16ms 3.062 MiB
#50 Accepted 16ms 3.027 MiB
#51 Accepted 18ms 3.074 MiB
#52 Accepted 18ms 2.988 MiB
#53 Accepted 18ms 3.109 MiB
#54 Accepted 18ms 3.023 MiB
#55 Accepted 17ms 2.984 MiB
#56 Accepted 14ms 3.023 MiB
#57 Accepted 14ms 3.117 MiB
#58 Accepted 14ms 3.117 MiB
#59 Accepted 14ms 3.02 MiB
#60 Accepted 15ms 3.02 MiB
#61 Accepted 16ms 2.938 MiB
#62 Accepted 16ms 3.074 MiB
#63 Accepted 16ms 3.105 MiB
#64 Accepted 16ms 3.062 MiB
#65 Accepted 16ms 3.02 MiB
#66 Accepted 16ms 3.059 MiB
#67 Accepted 16ms 3.0 MiB
#68 Accepted 16ms 3.051 MiB
#69 Accepted 16ms 3.023 MiB
#70 Accepted 16ms 3.113 MiB
#71 Accepted 16ms 3.074 MiB
#72 Accepted 16ms 3.02 MiB
#73 Accepted 16ms 3.09 MiB
#74 Accepted 16ms 2.977 MiB
#75 Accepted 16ms 3.066 MiB
#76 Accepted 15ms 3.023 MiB
#77 Accepted 14ms 3.102 MiB
#78 Accepted 14ms 2.926 MiB
#79 Accepted 18ms 3.121 MiB
#80 Accepted 18ms 3.02 MiB
#81 Accepted 1952ms 7.059 MiB
#82 Accepted 1949ms 7.094 MiB
#83 Accepted 1977ms 7.062 MiB
#84 Accepted 2001ms 7.094 MiB
#85 Accepted 1965ms 7.098 MiB
#86 Accepted 1987ms 7.012 MiB
#87 Accepted 1962ms 7.117 MiB
#88 Accepted 1968ms 7.074 MiB
#89 Accepted 1952ms 7.301 MiB
#90 Accepted 1960ms 7.02 MiB
#91 Accepted 2427ms 34.328 MiB
#92 Accepted 2454ms 34.305 MiB
#93 Accepted 2464ms 34.41 MiB
#94 Accepted 1878ms 30.027 MiB
#95 Accepted 1858ms 30.137 MiB
#96 Accepted 2463ms 32.039 MiB
#97 Accepted 2435ms 31.898 MiB
#98 Accepted 1934ms 18.359 MiB
#99 Accepted 1878ms 18.336 MiB
#100 Accepted 1876ms 18.473 MiB

Code

import sys

def solve():
    """
    Solves a single test case for the maximum score, minimum size problem.
    """
    n = int(sys.stdin.readline())
    a = list(map(int, sys.stdin.readline().split()))
    b = list(map(int, sys.stdin.readline().split()))

    # Fenwick Tree for Range Maximum Queries
    class MaxBIT:
        def __init__(self, size):
            self.tree = [0] * (size + 1)

        def update(self, idx, val):
            while idx < len(self.tree):
                self.tree[idx] = max(self.tree[idx], val)
                idx += idx & -idx

        def query(self, idx):
            max_val = 0
            while idx > 0:
                max_val = max(max_val, self.tree[idx])
                idx -= idx & -idx
            return max_val

    # 1. Forward pass to find the global maximum score (s_max)
    ft1 = MaxBIT(n)
    s_max = 0
    for i in range(n):
        # Find max score of subsequences ending with a value less than a[i]
        max_prev_score = ft1.query(a[i] - 1)
        current_score = max_prev_score + b[i]
        ft1.update(a[i], current_score)
        s_max = max(s_max, current_score)

    # 2. Backward pass to find the max score for all subsequences starting at i
    suffix_scores = [0] * n
    ft2 = MaxBIT(n)
    for i in range(n - 1, -1, -1):
        # Query for values > a[i] using coordinate transformation
        # Values > k are mapped to transformed indices < n - k + 1
        max_next_score = ft2.query(n - a[i])
        current_score = max_next_score + b[i]
        suffix_scores[i] = current_score
        # Update using the transformed index n - a[i] + 1
        ft2.update(n - a[i] + 1, current_score)

    # 3. Find the latest starting index `k` that can achieve s_max
    max_score_in_suffix = 0
    for k in range(n - 1, -1, -1):
        max_score_in_suffix = max(max_score_in_suffix, suffix_scores[k])
        if max_score_in_suffix == s_max:
            # This is the latest start point, so it gives the minimum size
            print(n - k)
            return

def main():
    """
    Main function to handle multiple test cases.
    """
    try:
        t = int(sys.stdin.readline())
        for _ in range(t):
            solve()
    except (IOError, ValueError):
        # Handles potential empty lines or formatting errors at the end of input
        pass

if __name__ == "__main__":
    main()

Information

Submit By
Type
Submission
Problem
P1224 Maximize the max
Contest
Testing - Intra LU Programming contest 25
Language
Python 3 (Python 3.12.3)
Submit At
2025-08-30 19:52:47
Judged At
2025-08-30 19:52:47
Judged By
Score
100
Total Time
2464ms
Peak Memory
34.41 MiB