結果
| 問題 | No.121 傾向と対策:門松列(その2) | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2017-04-25 15:56:49 | 
| 言語 | D (dmd 2.109.1) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 1,714 ms / 5,000 ms | 
| コード長 | 1,214 bytes | 
| コンパイル時間 | 819 ms | 
| コンパイル使用メモリ | 109,488 KB | 
| 実行使用メモリ | 120,172 KB | 
| 最終ジャッジ日時 | 2024-06-12 18:52:18 | 
| 合計ジャッジ時間 | 6,630 ms | 
| ジャッジサーバーID (参考情報) | judge2 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 9 | 
コンパイルメッセージ
Main.d(10): Deprecation: foreach: loop index implicitly converted from `size_t` to `int`
ソースコード
import std.algorithm, std.conv, std.range, std.stdio, std.string;
void main()
{
  auto n = readln.chomp.to!size_t;
  auto ai = readln.split.to!(int[]);
  auto bi = ai.dup.sort().array.uniq.array;
  int[int] ci;
  foreach (int i, b; bi) ci[b] = i + 1;
  auto di = ai.map!(a => ci[a]).array;
  auto maxD = di.maxElement;
  auto bt1 = BiTree!long(maxD);
  bt1.add(di[0], 1);
  auto bt2 = BiTree!long(maxD);
  foreach (d; di[2..$]) bt2.add(d, 1);
  auto ne = bt2.get(di[0]) - bt2.get(di[0] - 1);
  auto r = 0L;
  foreach (i; 1..n-1) {
    auto d1 = di[i], d2 = di[i+1];
    r += bt1.get(d1-1) * bt2.get(d1-1);
    r += (bt1.get(maxD) - bt1.get(d1)) * (bt2.get(maxD) - bt2.get(d1));
    r -= ne - (bt1.get(d1) - bt1.get(d1-1)) * (bt2.get(d1) - bt2.get(d1-1));
    bt1.add(d1, 1);
    ne += bt2.get(d1) - bt2.get(d1-1);
    bt2.add(d2, -1);
    ne -= bt1.get(d2) - bt1.get(d2-1);
  }
  writeln(r);
}
struct BiTree(T)
{
  T[] b; // buffer
  const size_t s; // size
  this(size_t t)
  {
    s = t;
    b = new T[](s + 1);
  }
  pure T get(size_t i) const
  {
    return i ? b[i] + get(i - (i & -i)) : 0;
  }
  void add(size_t i, T v)
  {
    if (i > s) return;
    b[i] += v;
    add(i + (i & -i), v);
  }
}
            
            
            
        