結果
問題 | No.121 傾向と対策:門松列(その2) |
ユーザー |
|
提出日時 | 2023-07-02 18:52:23 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 3,905 ms / 5,000 ms |
コード長 | 1,643 bytes |
コンパイル時間 | 376 ms |
コンパイル使用メモリ | 82,600 KB |
実行使用メモリ | 363,556 KB |
最終ジャッジ日時 | 2024-12-11 07:39:55 |
合計ジャッジ時間 | 12,853 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 9 |
ソースコード
from collections import *from itertools import *from functools import *from heapq import *import sys,math# input = sys.stdin.readlineclass FenwickTree():def __init__(self, n):self.n = nself.data = [0] * ndef build(self, arr):#assert len(arr) <= nfor i, a in enumerate(arr):self.data[i] = afor i in range(1, self.n + 1):if i + (i & -i) <= self.n:self.data[i + (i & -i) - 1] += self.data[i - 1]def add(self, p, x):#assert 0 <= p < self.np += 1while p <= self.n:self.data[p - 1] += xp += p & -pdef sum(self, r):#assert 0 <= r <= self.ns = 0while r:s += self.data[r - 1]r -= r & -rreturn sdef query(self, l, r):#assert 0 <= l <= r <= self.nreturn self.sum(r) - self.sum(l)N = int(input())A = list(map(int,input().split()))conv = list(set(A))conv.sort()inv = {a:i for i,a in enumerate(conv)}n = len(conv)X = FenwickTree(n)Y = FenwickTree(n)X.add(inv[A[0]],1)if N<=2:print(0)exit()ans = 0for i in range(2,N):Y.add(inv[A[i]], 1)for i in range(1,N-1):a = A[i]ans += X.query(0,inv[a])*Y.query(0,inv[a]) + (X.query(inv[a]+1,n))*(Y.query(inv[a]+1,n))X.add(inv[a],1)a = A[i+1]Y.add(inv[a],-1)Z = defaultdict(lambda:[])for i,a in enumerate(A):Z[a].append(i)for v in Z.values():k = len(v)for j in range(k-1):ans -= (v[j+1]-v[j]-1)*(j+1)*(k-1-j)print(ans)