結果
問題 | No.1975 Zigzag Sequence |
ユーザー |
![]() |
提出日時 | 2022-06-11 12:53:24 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 280 ms / 2,000 ms |
コード長 | 1,563 bytes |
コンパイル時間 | 536 ms |
コンパイル使用メモリ | 82,432 KB |
実行使用メモリ | 124,160 KB |
最終ジャッジ日時 | 2024-09-21 22:03:07 |
合計ジャッジ時間 | 8,474 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 33 |
ソースコード
#先頭からのsum,addをO(logN)class Fenwick_Tree:def __init__(self, n):self._n = n # 要素数self.data = [0] * ndef add(self, p, x):assert 0 <= p < self._np += 1 # 0-indexed -> 1-indexedwhile p <= self._n:self.data[p - 1] += x # dataを更新p += p & -p # pにLSB(p)を加算,data[i]の長さを示すdef _sum(self, r):#s = a0+a1+...+a[r-1] or 0s = 0 # 総和を入れる変数while r > 0:s += self.data[r - 1]r -= r & -r # rからLSB(r)を減算return sdef sum(self, l, r):#[l,r)の総和assert 0 <= l <= r <= self._nreturn self._sum(r) - self._sum(l)mod = 10**9+7n = int(input())a = list(map(int,input().split()))a2b = {key:idx for idx,key in enumerate(sorted(set(a)))}b = [a2b[a[i]] for i in range(n)]if n <= 2:print(0)exit()pow2 = [1]for i in range(n):pow2.append(pow2[-1]*2%mod)table = [[0 for _ in range(n)] for _ in range(4)]fw = [Fenwick_Tree(n+1) for _ in range(4)]for i in range(n):table[0][i] = fw[0].sum(0,b[i]) % modtable[1][i] = fw[1].sum(b[i]+1,n+1) % modfw[0].add(b[i],pow2[i])fw[1].add(b[i],pow2[i])for i in range(n):table[2][-1-i] = fw[2].sum(0,b[-1-i]) % modtable[3][-1-i] = fw[3].sum(b[-1-i]+1,n+1) % modfw[2].add(b[-1-i],pow2[i])fw[3].add(b[-1-i],pow2[i])ans = 0for i in range(1,n-1):ans += table[0][i] * table[2][i]ans += table[1][i] * table[3][i]ans %= modprint(ans)