結果
問題 | No.1300 Sum of Inversions |
ユーザー |
![]() |
提出日時 | 2020-11-27 23:11:10 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 870 ms / 2,000 ms |
コード長 | 1,747 bytes |
コンパイル時間 | 3,238 ms |
コンパイル使用メモリ | 80,388 KB |
実行使用メモリ | 77,420 KB |
最終ジャッジ日時 | 2024-07-26 19:31:27 |
合計ジャッジ時間 | 27,363 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 34 |
ソースコード
import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.Arrays;public class Main {public static void main(String[] args) throws Exception {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(br.readLine());String[] sa = br.readLine().split(" ");int[] a = new int[n];for (int i = 0; i < n; i++) {a[i] = Integer.parseInt(sa[i]);}br.close();Obj[] arr = new Obj[n];for (int i = 0; i < n; i++) {Obj o = new Obj();o.i = i + 1;o.a = a[i];arr[i] = o;}Arrays.sort(arr, (o1, o2) -> {if (o1.a != o2.a) {return o1.a - o2.a;} else {return o1.i - o2.i;}});int mod = 998244353;BIT bit1 = new BIT(n + 1);BIT bit1c = new BIT(n + 1);BIT bit2 = new BIT(n + 1);BIT bit2c = new BIT(n + 1);long ans = 0;for (int i = 0; i < n; i++) {Obj o = arr[i];long v2 = bit2.sum(n) - bit2.sum(o.i);long c2 = bit2c.sum(n) - bit2c.sum(o.i);c2 %= mod;long val = o.a * c2 % mod + v2 % mod;ans += val % mod;ans %= mod;long v1 = bit1.sum(n) - bit1.sum(o.i);long c1 = bit1c.sum(n) - bit1c.sum(o.i);c1 %= mod;long p = o.a * c1 % mod + v1 % mod;bit2.add(o.i, p % mod);bit2c.add(o.i, c1 % mod);bit1.add(o.i, o.a);bit1c.add(o.i, 1);}System.out.println(ans);}static class Obj {int i, a;}static class BIT {int n;long[] arr;public BIT(int n) {this.n = n;arr = new long[n + 1];}void add(int idx, long val) {for (int i = idx; i <= n; i += i & -i) {arr[i] += val;}}long sum(int idx) {long sum = 0;for (int i = idx; i > 0; i -= i & -i) {sum += arr[i];}return sum;}}}