結果

問題 No.3128 Isosceles Triangle
ユーザー kakel-san
提出日時 2025-04-25 22:02:02
言語 C#
(.NET 8.0.404)
結果
AC  
実行時間 248 ms / 2,500 ms
コード長 1,684 bytes
コンパイル時間 18,971 ms
コンパイル使用メモリ 171,504 KB
実行使用メモリ 252,300 KB
最終ジャッジ日時 2025-04-25 22:02:52
合計ジャッジ時間 25,373 ms
ジャッジサーバーID
(参考情報)
judge3 / judge5
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 30
権限があれば一括ダウンロードができます
コンパイルメッセージ
  復元対象のプロジェクトを決定しています...
  /home/judge/data/code/main.csproj を復元しました (104 ミリ秒)。
  main -> /home/judge/data/code/bin/Release/net8.0/main.dll
  main -> /home/judge/data/code/bin/Release/net8.0/publish/

ソースコード

diff #

using System;
using static System.Console;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static int NN => int.Parse(ReadLine());
    static int[] NList => ReadLine().Split().Select(int.Parse).ToArray();
    static int[] LList(long n) => Enumerable.Repeat(0, (int)n).Select(_ => int.Parse(ReadLine())).ToArray();
    public static void Main()
    {
        Solve();
    }
    static void Solve()
    {
        var n = NN;
        var a = NList;
        var set = new HashSet<int>(a);
        var list = new List<int>(set);
        list.Sort();
        var dic = new Dictionary<int, int>();
        for (var i = 0; i < list.Count; ++i) dic[list[i]] = i;
        var counts = new int[list.Count];
        foreach (var ai in a) ++counts[dic[ai]];
        var cum = new int[list.Count];
        cum[0] = counts[0];
        for (var i = 1; i < list.Count; ++i) cum[i] = cum[i - 1] + counts[i];
        var ans = 0L;
        for (var i = 0; i < list.Count; ++i)
        {
            if (counts[i] > 1)
            {
                var eq = (long)counts[i] * (counts[i] - 1) / 2;
                var pos = LowerBound(0, list[i] * 2, list) - 1;
                ans += eq * (cum[pos] - counts[i]);
            }
        }
        WriteLine(ans);
    }
    static int LowerBound(int left, int min, IList<int> list)
    {
        if (list[left] >= min) return left;
        var ng = left;
        var ok = list.Count;
        while (ok - ng > 1)
        {
            var center = (ng + ok) / 2;
            if (list[center] < min) ng = center;
            else ok = center;
        }
        return ok;
    }
}
0