제출 #1339184

#제출 시각아이디문제언어결과실행 시간메모리
1339184po_rag526Zoltan (COCI16_zoltan)Pypy 3
0 / 140
327 ms131072 KiB
import sys
input = sys.stdin.readline
MOD = 10**9 + 7

def merge(a_len, a_cnt, b_len, b_cnt):
    if a_len > b_len:
        return a_len, a_cnt
    if b_len > a_len:
        return b_len, b_cnt
    if a_len == 0:
        return 0, 0
    return a_len, (a_cnt + b_cnt) % MOD

class Fenwick:
    def __init__(self, n):
        self.n = n
        self.len_bit = [0] * (n + 2)
        self.cnt_bit = [0] * (n + 2)

    def update(self, i, length, count):
        n = self.n
        len_bit = self.len_bit
        cnt_bit = self.cnt_bit
        while i <= n:
            cur_len = len_bit[i]
            if length > cur_len:
                len_bit[i] = length
                cnt_bit[i] = count
            elif length == cur_len:
                if length != 0:
                    cnt_bit[i] = (cnt_bit[i] + count) % MOD
            i += i & -i

    def query(self, i):
        best_len = 0
        best_cnt = 0
        len_bit = self.len_bit
        cnt_bit = self.cnt_bit
        while i > 0:
            cur_len = len_bit[i]
            if cur_len > best_len:
                best_len = cur_len
                best_cnt = cnt_bit[i]
            elif cur_len == best_len and cur_len != 0:
                best_cnt = (best_cnt + cnt_bit[i]) % MOD
            i -= i & -i
        return best_len, best_cnt

def solve():
    n = int(input())
    arr = list(map(int, input().split()))
    vals = sorted(set(arr))
    rank = {v: i + 1 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
    bit_inc = Fenwick(m)  
    bit_dec = Fenwick(m)

    for i in range(n - 1, -1, -1):
        p = rank[arr[i]]
        rev = m - p + 1
        best_len, ways = bit_inc.query(rev - 1)
        if best_len == 0:
            inc_len[i] = 1
            inc_cnt[i] = 1
        else:
            inc_len[i] = best_len + 1
            inc_cnt[i] = ways
        bit_inc.update(rev, inc_len[i], inc_cnt[i])
        best_len, ways = bit_dec.query(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
        bit_dec.update(p, dec_len[i], dec_cnt[i])

    best = 0
    for i in range(n):
        cur = inc_len[i] + dec_len[i] - 1
        if cur > best:
            best = cur

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

    total = total * pow(2, n - best, MOD) % MOD
    print(best, total)

solve()

컴파일 시 표준 출력 (stdout) 메시지

Compiling 'zoltan.py'...

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

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