結果
問題 | No.1975 Zigzag Sequence |
ユーザー |
|
提出日時 | 2022-06-11 08:23:16 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,057 ms / 2,000 ms |
コード長 | 4,463 bytes |
コンパイル時間 | 412 ms |
コンパイル使用メモリ | 81,972 KB |
実行使用メモリ | 116,208 KB |
最終ジャッジ日時 | 2024-12-26 22:39:21 |
合計ジャッジ時間 | 22,202 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 33 |
ソースコード
import bisectfrom collections import *class BIT:def __init__(self,len_A):self.N = len_A + 10self.bit = [0]*(len_A+10)# sum(A0 ~ Ai)# O(log N)def query(self,i):res = 0idx = i+1while idx:res += self.bit[idx]idx -= idx&(-idx)return res# Ai += x# O(log N)def update(self,i,x):idx = i+1while idx < self.N:self.bit[idx] += xidx += idx&(-idx)# min_i satisfying {sum(A0 ~ Ai) >= w} (Ai >= 0)# O(log N)def lower_left(self,w):if (w < 0):return -1x = 0k = 1<<(self.N.bit_length()-1)while k > 0:if x+k < self.N and self.bit[x+k] < w:w -= self.bit[x+k]x += kk //= 2return xclass OrderBIT:def __init__(self,all_values,sort_flag = False):if sort_flag:self.A = all_valueselse:self.A = sorted(all_values)self.B = BIT(len(all_values))self.num = 0def insert_val(self,x,c=1):k = bisect.bisect_left(self.A,x)self.B.update(k,c)self.num += cdef delete_val(self,x,c=1):k = bisect.bisect_left(self.A,x)self.B.update(k,-c)self.num -= c# find the k-th min_val (k:0-indexed)def find_kth_val(self,k):if self.num <= k:##### MINIMUM VAL #######return -10**9return self.A[self.B.lower_left(k+1)]# count the number of values lower than or equal to xdef count_lower(self,x):if x < self.A[0]:return 0return self.B.query(bisect.bisect_right(self.A,x)-1)# min_val higher than xdef find_higher(self,x):return self.find_kth_val(self.count_lower(x))# min_val lower than xdef find_lower(self,x):return self.find_kth_val(self.count_lower(x)-1)N = int(input())A = list(map(int,input().split()))mod = 10**9 + 7def segfunc(x, y):return (x+y)%modide_ele = 0class SegTree:"""Segment Tree"""def __init__(self, init_val, segfunc, ide_ele):"""初期化init_val: 配列の初期値"""n = len(init_val)self.segfunc = segfuncself.ide_ele = ide_eleself.num = 1 << (n - 1).bit_length()self.tree = [ide_ele] * 2 * self.num# 配列の値を葉にセットfor i in range(n):self.tree[self.num + i] = init_val[i]# 構築していくfor i in range(self.num - 1, 0, -1):self.tree[i] = segfunc(self.tree[2 * i], self.tree[2 * i + 1])def update(self, k, x):"""k番目の値をxに更新k: index(0-index)x: update value"""k += self.numself.tree[k] = xwhile k > 1:self.tree[k >> 1] = self.segfunc(self.tree[k], self.tree[k ^ 1])k >>= 1def query(self, l, r):"""[l, r)のsegfuncしたものを得るl: index(0-index)r: index(0-index)"""res = self.ide_elel += self.numr += self.numwhile l < r:if l & 1:res = self.segfunc(res, self.tree[l])l += 1if r & 1:res = self.segfunc(res, self.tree[r - 1])l >>= 1r >>= 1return resc = Counter(A)ans = 0X = [(A[i],i) for i in range(N)]X.sort()cnd = []U = SegTree([0 for _ in range(N)],segfunc,ide_ele)V = SegTree([0 for _ in range(N)],segfunc,ide_ele)for i in range(N):a,t = X[i]c[a] -= 1cnd.append(t)if c[a]==0:for j in cnd:ans += U.query(j+1,N)*V.query(0,j)ans %= modfor j in cnd:U.update(j,pow(2,N-1-j,mod))V.update(j,pow(2,j,mod))cnd = []U = SegTree([0 for _ in range(N)],segfunc,ide_ele)V = SegTree([0 for _ in range(N)],segfunc,ide_ele)c = Counter(A)for i in range(N-1,-1,-1):a,t = X[i]c[a] -= 1cnd.append(t)if c[a]==0:for j in cnd:ans += U.query(j+1,N)*V.query(0,j)ans %= modfor j in cnd:U.update(j,pow(2,N-1-j,mod))V.update(j,pow(2,j,mod))cnd = []print(ans)