結果

問題 No.1300 Sum of Inversions
ユーザー 👑 KazunKazun
提出日時 2020-11-27 22:39:09
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 1,618 ms / 2,000 ms
コード長 3,363 bytes
コンパイル時間 275 ms
コンパイル使用メモリ 87,316 KB
実行使用メモリ 185,588 KB
最終ジャッジ日時 2023-10-09 20:44:13
合計ジャッジ時間 40,222 ms
ジャッジサーバーID
(参考情報)
judge12 / judge14
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 94 ms
71,960 KB
testcase_01 AC 96 ms
71,904 KB
testcase_02 AC 95 ms
71,972 KB
testcase_03 AC 1,239 ms
158,968 KB
testcase_04 AC 1,236 ms
164,292 KB
testcase_05 AC 1,037 ms
162,832 KB
testcase_06 AC 1,423 ms
163,452 KB
testcase_07 AC 1,349 ms
162,492 KB
testcase_08 AC 1,502 ms
168,076 KB
testcase_09 AC 1,484 ms
167,328 KB
testcase_10 AC 882 ms
152,516 KB
testcase_11 AC 887 ms
152,556 KB
testcase_12 AC 1,247 ms
162,184 KB
testcase_13 AC 1,232 ms
165,348 KB
testcase_14 AC 1,618 ms
179,968 KB
testcase_15 AC 1,498 ms
167,632 KB
testcase_16 AC 1,266 ms
157,144 KB
testcase_17 AC 831 ms
145,360 KB
testcase_18 AC 947 ms
154,148 KB
testcase_19 AC 1,114 ms
168,024 KB
testcase_20 AC 1,156 ms
168,388 KB
testcase_21 AC 1,115 ms
168,352 KB
testcase_22 AC 1,015 ms
162,948 KB
testcase_23 AC 1,404 ms
163,240 KB
testcase_24 AC 1,056 ms
163,060 KB
testcase_25 AC 919 ms
153,460 KB
testcase_26 AC 907 ms
153,300 KB
testcase_27 AC 1,012 ms
162,616 KB
testcase_28 AC 1,537 ms
175,800 KB
testcase_29 AC 1,142 ms
168,340 KB
testcase_30 AC 1,491 ms
167,896 KB
testcase_31 AC 1,045 ms
163,064 KB
testcase_32 AC 1,078 ms
163,260 KB
testcase_33 AC 242 ms
105,504 KB
testcase_34 AC 248 ms
108,584 KB
testcase_35 AC 789 ms
185,588 KB
testcase_36 AC 886 ms
170,504 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

class Binary_Indexed_Tree_Exception(Exception):
    pass

class Binary_Indexed_Tree():
    def __init__(self,L):
        """calcを演算とするN項のBinary Indexed Treeを作成

        calc:演算(2変数関数,群)
        unit:群calcの単位元(xe=ex=xを満たすe)
        inv:群calcの逆元(1変数関数)
        """

        N=len(L)
        d=max(1,(N-1).bit_length())
        k=2**d

        X=[None]+[0]*k

        self.num=k
        self.depth=d

        if L:
            for i in range(len(L)):
                p=i+1
                while p<=k:
                    X[p]=(X[p]+L[i])
                    p+=p&(-p)
        self.data=X

    def index(self,k,index=1):
        """第k要素の値を出力する.

        k:数列の要素
        index:先頭の要素の番号
        """

        p=k+(1-index)
        return self.sum(p,p,index)

    def add(self,k,x,index=1,right=False):
        """第k要素にxを左から加え,更新を行う.

        k:数列の要素
        x:更新後の値
        index:先頭の要素の番号
        right:「左から」が「右から」になる
        """
        p=k+(1-index)
        while p<=self.num:
            if right==False:
                #左から
                self.data[p]=x+self.data[p]
            else:
                #右から
                self.data[p]=self.data[p]+x
            p+=p&(-p)

    def update(self,k,x,index=1,right=False):
        """第k要素をxに変え,更新を行う.

        k:数列の要素
        x:更新後の値
        """

        a=self.index(k,index)
        if right==False:
            #左から
            y=x-a
        else:
            #右から
            y=-a+x

        self.add(k,y,index,right)

    def sum(self,From,To,index=1):
        """第From要素から第To要素までの総和を求める.

        ※From!=1を使うならば,群でなくてはならない.
        From:始まり
        To:終わり
        index:先頭の要素の番号
        """
        alpha=max(1,From+(1-index))
        beta=min(self.num,To+(1-index))

        if alpha==1:
            return self.__section(beta)
        else:
            return -self.__section(alpha-1)+self.__section(beta)

    def __section(self,To):
        S=0
        x=To
        while x>0:
            S+=self.data[x]
            x-=x&(-x)
        return S

    def all_sum(self):
        return self.data[-1]
#================================================
from collections import deque,defaultdict
import sys
input=sys.stdin.readline

N=int(input())
A=list(map(int,input().split()))
Mod=998244353

Count=defaultdict(int)
for a in A:
    Count[a]+=1

S=list(set(A))
S.sort()
T=len(S)
D={x:i for i,x in enumerate(S)}
L=[0]*T

for x in D:
    L[D[x]]=Count[x]

X=Binary_Indexed_Tree([0]*T)
Y=Binary_Indexed_Tree(L)

P=Binary_Indexed_Tree([0]*T)
Q=Binary_Indexed_Tree([S[i]*Count[S[i]] for i in range(T)])

K=0
S_min,S_max=S[-1],S[0]

for a in A:
    if a==S_min or a==S_max:
        X.add(D[a],1,0)
        Y.add(D[a],-1,0)
        P.add(D[a],a,0)
        Q.add(D[a],-a,0)
        continue

    alpha=X.sum(D[a]+1,T-1,0)
    beta =Y.sum(0,D[a]-1,0)

    mu=P.sum(D[a]+1,T-1,0)
    nu=Q.sum(0,D[a]-1,0)

    K+=alpha*nu+beta*mu+a*(alpha*beta)
    K%=Mod

    X.add(D[a],1,0)
    Y.add(D[a],-1,0)

    P.add(D[a],a,0)
    Q.add(D[a],-a,0)

print(K)
0