結果
問題 | No.1300 Sum of Inversions |
ユーザー |
|
提出日時 | 2020-11-27 22:11:32 |
言語 | Kotlin (2.1.0) |
結果 |
AC
|
実行時間 | 1,422 ms / 2,000 ms |
コード長 | 4,186 bytes |
コンパイル時間 | 19,702 ms |
コンパイル使用メモリ | 463,692 KB |
実行使用メモリ | 126,912 KB |
最終ジャッジ日時 | 2024-07-26 13:06:39 |
合計ジャッジ時間 | 61,405 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 34 |
ソースコード
import java.io.InputStreamimport java.io.PrintWriterimport java.util.*// ModInt// regionclass ModInt(x: Long) {companion object {//const val MOD = 1000000007Lconst val MOD = 998244353L}val x = (x % MOD + MOD) % MODoperator fun plus(other: ModInt): ModInt {return ModInt(x + other.x)}operator fun minus(other: ModInt): ModInt {return ModInt(x - other.x)}operator fun times(other: ModInt): ModInt {return ModInt(x * other.x)}operator fun div(other: ModInt): ModInt {return this * other.inv()}fun pow(exp: Long): ModInt {if (exp == 0L) return ModInt(1L)var a = pow(exp shr 1)a *= aif (exp and 1L == 0L) return areturn this * a}fun inv(): ModInt {return this.pow(MOD - 2)}override fun equals(other: Any?): Boolean {if (this === other) return trueif (javaClass != other?.javaClass) return falseother as ModIntif (x != other.x) return falsereturn true}override fun hashCode(): Int {return x.hashCode()}override fun toString(): String {return "$x"}}val fac = mutableListOf<ModInt>()val invfac = mutableListOf<ModInt>()fun fact(n: Long, b: Boolean): ModInt {if (fac.count() == 0) {fac.add(ModInt(1))invfac.add(ModInt(1))}while (fac.count() <= n) {fac.add(fac.last() * ModInt(fac.count().toLong()))invfac.add(fac.last().inv())}return if (b) {fac[n.toInt()]} else {invfac[n.toInt()]}}fun comb(n: Long, k: Long): ModInt {return fact(n, true) * fact(k, false) * fact(n - k, false)}fun comb2(n: Long, k: Long): ModInt {var ans = ModInt(1)for (i in 0 until k) {ans = ans * ModInt(n - i) / ModInt(k - i)}return ans}// endregionfun compress(a: Array<Long>): Array<Int> {val n = a.count()val b = a.sorted().distinct().toTypedArray()val c = Array(n) { 0 }for (i in 0 until n) {c[i] = Arrays.binarySearch(b, a[i])}return c}class BIT(private val n: Int) {private val data = LongArray(n) { 0 }fun add(i: Int, x: Long) {var p = i + 1while (p <= n) {data[p - 1] += xp += p and -p}}fun sum(l: Int, r: Int): Long {return sum(r) - sum(l)}private fun sum(i: Int): Long {var r = ivar s = 0Lwhile(r > 0) {s += data[r - 1]r -= r and -r}return s}}fun PrintWriter.solve() = with(FastScanner(System.`in`)) {val n = nextInt()val a = Array(n) { nextLong() }val b = compress(a)val bit1 = BIT(n)val bit2 = BIT(n)val cnt_l = Array(n) { 0L }val sum_l = Array(n) { 0L }var sum = 0Lfor (i in 0 until n) {cnt_l[i] = i - bit1.sum(0, b[i] + 1)bit1.add(b[i], 1)sum_l[i] = sum - bit2.sum(0, b[i] + 1)bit2.add(b[i], a[i])sum += a[i]}val bit3 = BIT(n)val bit4 = BIT(n)val cnt_r = Array(n) { 0L }val sum_r = Array(n) { 0L }sum = 0Lfor (i in n - 1 downTo 0) {cnt_r[i] = bit3.sum(0, b[i])bit3.add(b[i], 1)sum_r[i] = bit4.sum(0, b[i])bit4.add(b[i], a[i])sum += a[i]}var ans = ModInt(0)for (j in 1 until n - 1) {ans += ModInt(a[j]) * ModInt(cnt_l[j] * cnt_r[j])ans += ModInt(sum_l[j]) * ModInt(cnt_r[j])ans += ModInt(sum_r[j]) * ModInt(cnt_l[j])}println(ans)}fun main() {val writer = PrintWriter(System.out, false)writer.solve()writer.flush()}class FastScanner(s: InputStream) {private var st = StringTokenizer("")private val br = s.bufferedReader()fun next(): String {while (!st.hasMoreTokens()) st = StringTokenizer(br.readLine())return st.nextToken()}fun nextInt() = next().toInt()fun nextLong() = next().toLong()fun nextLine() = br.readLine()fun nextDouble() = next().toDouble()}