結果
問題 | No.1300 Sum of Inversions |
ユーザー | keymoon |
提出日時 | 2020-11-27 21:44:50 |
言語 | C#(csc) (csc 3.9.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 6,187 bytes |
コンパイル時間 | 2,722 ms |
コンパイル使用メモリ | 120,712 KB |
実行使用メモリ | 67,600 KB |
最終ジャッジ日時 | 2024-07-26 12:07:58 |
合計ジャッジ時間 | 25,603 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 42 ms
25,760 KB |
testcase_01 | AC | 43 ms
26,012 KB |
testcase_02 | AC | 42 ms
25,524 KB |
testcase_03 | WA | - |
testcase_04 | WA | - |
testcase_05 | WA | - |
testcase_06 | WA | - |
testcase_07 | WA | - |
testcase_08 | WA | - |
testcase_09 | WA | - |
testcase_10 | WA | - |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | WA | - |
testcase_16 | WA | - |
testcase_17 | WA | - |
testcase_18 | WA | - |
testcase_19 | WA | - |
testcase_20 | WA | - |
testcase_21 | WA | - |
testcase_22 | WA | - |
testcase_23 | WA | - |
testcase_24 | WA | - |
testcase_25 | WA | - |
testcase_26 | WA | - |
testcase_27 | WA | - |
testcase_28 | WA | - |
testcase_29 | WA | - |
testcase_30 | WA | - |
testcase_31 | WA | - |
testcase_32 | WA | - |
testcase_33 | AC | 160 ms
48,608 KB |
testcase_34 | AC | 209 ms
55,540 KB |
testcase_35 | WA | - |
testcase_36 | WA | - |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Numerics; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using static System.Math; using MethodImplAttribute = System.Runtime.CompilerServices.MethodImplAttribute; using MethodImplOptions = System.Runtime.CompilerServices.MethodImplOptions; public static class P { public static void Main() { int n = int.Parse(Console.ReadLine()); var a = Console.ReadLine().Split().Select(int.Parse).ToArray(); var ordered = a.Distinct().OrderBy(x => x).ToArray(); var dic = ordered.Select((elem, ind) => (elem, ind)).ToDictionary(x => x.elem, x => x.ind); a = a.Select(x => dic[x]).ToArray(); (ModInt val, long cnt)[] lRes = new (ModInt val, long cnt)[n]; { var segTree = new SegmentTree<(ModInt, long)>(ordered.Length, (0, 0), (x, y) => (x.Item1 + y.Item1, x.Item2 + y.Item2)); for (int i = 0; i < lRes.Length; i++) { lRes[i] = segTree.Query(a[i] + 1, ordered.Length - 1); segTree.Operate(a[i], (ordered[a[i]], 1)); } } (ModInt val, long cnt)[] rRes = new (ModInt val, long cnt)[n]; { var segTree = new SegmentTree<(ModInt, long)>(ordered.Length, (0, 0), (x, y) => (x.Item1 + y.Item1, x.Item2 + y.Item2)); for (int i = rRes.Length - 1; i >= 0; i--) { rRes[i] = segTree.Query(0, a[i] - 1); segTree.Operate(a[i], (ordered[a[i]], 1)); } } ModInt res = 0; for (int i = 0; i < n; i++) { var (lVal, lCnt) = lRes[i]; var (rVal, rCnt) = rRes[i]; var sum = lVal * rCnt + rVal * lCnt + lCnt * rCnt * ordered[a[i]]; res += sum; } Console.WriteLine(res); } } class SegmentTree<T> { public int Size { get; private set; } T Identity; T[] Data; Func<T, T, T> Merge; int LeafCount; [MethodImpl(MethodImplOptions.AggressiveInlining)] public SegmentTree(int size, T identity, Func<T, T, T> merge) { Init(size, identity, merge); for (int i = 1; i < Data.Length; i++) Data[i] = identity; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public SegmentTree(T[] elems, T identity, Func<T, T, T> merge) { Init(elems.Length, identity, merge); elems.CopyTo(Data, LeafCount); for (int i = elems.Length + LeafCount; i < Data.Length; i++) Data[i] = identity; for (int i = LeafCount - 1; i >= 1; i--) Data[i] = Merge(Data[i << 1], Data[(i << 1) | 1]); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private void Init(int size, T identity, Func<T, T, T> merge) { Size = size; Identity = identity; Merge = merge; LeafCount = 1; while (LeafCount < size) LeafCount <<= 1; Data = new T[LeafCount << 1]; } public T this[int index] { [MethodImpl(MethodImplOptions.AggressiveInlining)] get { return Data[LeafCount + index]; } [MethodImpl(MethodImplOptions.AggressiveInlining)] set { Update(index, value); } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Update(int i, T x) { Data[i += LeafCount] = x; while (0 < (i >>= 1)) Data[i] = Merge(Data[i << 1], Data[(i << 1) | 1]); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Operate(int i, T x) { i += LeafCount; Data[i] = Merge(Data[i], x); while (0 < (i >>= 1)) Data[i] = Merge(Data[i << 1], Data[(i << 1) | 1]); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public T Query(int l, int r) { T lRes = Identity, rRes = Identity; for (l += LeafCount, r += LeafCount; l <= r; l = (l + 1) >> 1, r = (r - 1) >> 1) { if ((l & 1) == 1) lRes = Merge(lRes, Data[l]); if ((r & 1) == 0) rRes = Merge(Data[r], rRes); } return Merge(lRes, rRes); } } struct ModInt { public const int Mod = 1000000007; const long POSITIVIZER = ((long)Mod) << 31; long Data; public ModInt(long data) { if ((Data = data % Mod) < 0) Data += Mod; } public static implicit operator long(ModInt modInt) => modInt.Data; public static implicit operator ModInt(long val) => new ModInt(val); public static ModInt operator +(ModInt a, int b) => new ModInt() { Data = (a.Data + b + POSITIVIZER) % Mod }; public static ModInt operator +(ModInt a, long b) => new ModInt(a.Data + b); public static ModInt operator +(ModInt a, ModInt b) { long res = a.Data + b.Data; return new ModInt() { Data = res >= Mod ? res - Mod : res }; } public static ModInt operator -(ModInt a, int b) => new ModInt() { Data = (a.Data - b + POSITIVIZER) % Mod }; public static ModInt operator -(ModInt a, long b) => new ModInt(a.Data - b); public static ModInt operator -(ModInt a, ModInt b) { long res = a.Data - b.Data; return new ModInt() { Data = res < 0 ? res + Mod : res }; } public static ModInt operator *(ModInt a, int b) => new ModInt(a.Data * b); public static ModInt operator *(ModInt a, long b) => a * new ModInt(b); public static ModInt operator *(ModInt a, ModInt b) => new ModInt() { Data = a.Data * b.Data % Mod }; public static ModInt operator /(ModInt a, ModInt b) => new ModInt() { Data = a.Data * GetInverse(b) % Mod }; public static bool operator ==(ModInt a, ModInt b) => a.Data == b.Data; public static bool operator !=(ModInt a, ModInt b) => a.Data != b.Data; public override string ToString() => Data.ToString(); public override bool Equals(object obj) => (ModInt)obj == this; public override int GetHashCode() => (int)Data; static long GetInverse(long a) { long div, p = Mod, x1 = 1, y1 = 0, x2 = 0, y2 = 1; while (true) { if (p == 1) return x2 + Mod; div = a / p; x1 -= x2 * div; y1 -= y2 * div; a %= p; if (a == 1) return x1 + Mod; div = p / a; x2 -= x1 * div; y2 -= y1 * div; p %= a; } } }