結果
問題 | No.1975 Zigzag Sequence |
ユーザー |
|
提出日時 | 2022-06-16 11:31:22 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 638 ms / 2,000 ms |
コード長 | 1,922 bytes |
コンパイル時間 | 423 ms |
コンパイル使用メモリ | 82,304 KB |
実行使用メモリ | 109,624 KB |
最終ジャッジ日時 | 2024-10-06 04:51:47 |
合計ジャッジ時間 | 15,045 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 33 |
ソースコード
from bisect import bisect_leftimport sysint1 = lambda x: int(x) - 1# input = lambda: sys.stdin.buffer.readline()input = lambda: sys.stdin.readline().rstrip()ii = lambda: int(input())i1 = lambda: int1(input())mi = lambda: map(int, input().split())mi1 = lambda: map(int1, input().split())li = lambda: list(mi())li1 = lambda: list(mi1())lli = lambda n: [li() for _ in range(n)]INF = float("inf")mod = int(1e9 + 7)# mod = 998244353class fenwick_tree:n = 1data = [0 for i in range(n)]def __init__(self, N):self.n = Nself.data = [0 for i in range(N)]def add(self, p, x):assert 0 <= p < self.n, "0<=p<n,p={0},n={1}".format(p, self.n)p += 1while p <= self.n:self.data[p - 1] += xif self.data[p - 1] < 0:self.data[p - 1] += modelif self.data[p - 1] >= mod:self.data[p - 1] -= modp += p & -pdef sum(self, l, r):assert 0 <= l and l <= r and r <= self.n, "0<=l<=r<=n,l={0},r={1},n={2}".format(l, r, self.n)res = self.sum0(r) - self.sum0(l)if res < 0:res += modelif res >= mod:res -= modreturn resdef sum0(self, r):s = 0while r > 0:s += self.data[r - 1]if s < 0:s += modelif s >= mod:s -= modr -= r & -rreturn sn = ii()a = li()c = sorted(set(a))s = len(c)p2 = [pow(2, i, mod) for i in range(n)]l = fenwick_tree(s)r = fenwick_tree(s)for i in range(n):r.add(bisect_left(c, a[i]), p2[n - 1 - i])ans = 0for i in range(n):idx = bisect_left(c, a[i])r.add(idx, mod - p2[n - 1 - i])ans = (ans + l.sum0(idx) * r.sum0(idx) + l.sum(idx + 1, s) * r.sum(idx + 1, s)) % modl.add(idx, p2[i])print(ans)