Submission #1339180

#TimeUsernameProblemLanguageResultExecution timeMemory
1339180vjudge1Zoltan (COCI16_zoltan)Pypy 3
0 / 140
699 ms131072 KiB
def merge(a, b):
    if a[0] > b[0]:
        return a
    if b[0] > a[0]:
        return b
    if a[0] == 0:
        return (0, 0)
    return (a[0], a[1] + b[1])


class SegTree:
    def __init__(self, n):
        self.size = 1
        while self.size < n:
            self.size *= 2
        self.tree = [(0, 0)] * (2 * self.size)

    def update(self, pos, val):
        pos += self.size
        self.tree[pos] = merge(self.tree[pos], val)
        pos //= 2
        while pos:
            self.tree[pos] = merge(self.tree[2 * pos], self.tree[2 * pos + 1])
            pos //= 2

    def query(self, left, right):
        if left > right:
            return (0, 0)
        left += self.size
        right += self.size
        res_left = (0, 0)
        res_right = (0, 0)
        while left <= right:
            if left & 1:
                res_left = merge(res_left, self.tree[left])
                left += 1
            if not (right & 1):
                res_right = merge(self.tree[right], res_right)
                right -= 1
            left //= 2
            right //= 2
        return merge(res_left, res_right)


def solve():
    n = int(input())
    arr = list(map(int, input().split()))

    vals = sorted(set(arr))
    comp = {v: i for i, v in enumerate(vals)}
    m = len(vals)

    inc_len = [0] * n
    inc_cnt = [0] * n
    dec_len = [0] * n
    dec_cnt = [0] * n

    inc_tree = SegTree(m)
    dec_tree = SegTree(m)

    for i in range(n - 1, -1, -1):
        p = comp[arr[i]]

        best_len, ways = inc_tree.query(p + 1, m - 1)
        if best_len == 0:
            inc_len[i] = 1
            inc_cnt[i] = 1
        else:
            inc_len[i] = best_len + 1
            inc_cnt[i] = ways
        inc_tree.update(p, (inc_len[i], inc_cnt[i]))

        best_len, ways = dec_tree.query(0, p - 1)
        if best_len == 0:
            dec_len[i] = 1
            dec_cnt[i] = 1
        else:
            dec_len[i] = best_len + 1
            dec_cnt[i] = ways
        dec_tree.update(p, (dec_len[i], dec_cnt[i]))

    best = 0
    for i in range(n):
        best = max(best, inc_len[i] + dec_len[i] - 1)

    total = 0
    for i in range(n):
        if inc_len[i] + dec_len[i] - 1 == best:
            total += inc_cnt[i] * dec_cnt[i]

    total *= pow(2, n - best)

    print(best, total)


solve()

Compilation message (stdout)

Compiling 'zoltan.py'...

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

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