結果

問題 No.461 三角形はいくつ?
ユーザー izuru_matsuuraizuru_matsuura
提出日時 2016-12-15 13:55:59
言語 D
(dmd 2.106.1)
結果
AC  
実行時間 301 ms / 5,000 ms
コード長 2,038 bytes
コンパイル時間 1,848 ms
コンパイル使用メモリ 150,784 KB
実行使用メモリ 5,376 KB
最終ジャッジ日時 2024-06-12 05:37:26
合計ジャッジ時間 7,520 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
5,248 KB
testcase_01 AC 2 ms
5,376 KB
testcase_02 AC 1 ms
5,376 KB
testcase_03 AC 0 ms
5,376 KB
testcase_04 AC 1 ms
5,376 KB
testcase_05 AC 256 ms
5,376 KB
testcase_06 AC 148 ms
5,376 KB
testcase_07 AC 177 ms
5,376 KB
testcase_08 AC 111 ms
5,376 KB
testcase_09 AC 1 ms
5,376 KB
testcase_10 AC 32 ms
5,376 KB
testcase_11 AC 196 ms
5,376 KB
testcase_12 AC 84 ms
5,376 KB
testcase_13 AC 298 ms
5,376 KB
testcase_14 AC 298 ms
5,376 KB
testcase_15 AC 288 ms
5,376 KB
testcase_16 AC 15 ms
5,376 KB
testcase_17 AC 15 ms
5,376 KB
testcase_18 AC 276 ms
5,376 KB
testcase_19 AC 254 ms
5,376 KB
testcase_20 AC 270 ms
5,376 KB
testcase_21 AC 289 ms
5,376 KB
testcase_22 AC 301 ms
5,376 KB
testcase_23 AC 40 ms
5,376 KB
testcase_24 AC 38 ms
5,376 KB
testcase_25 AC 5 ms
5,376 KB
testcase_26 AC 5 ms
5,376 KB
testcase_27 AC 170 ms
5,376 KB
testcase_28 AC 5 ms
5,376 KB
testcase_29 AC 58 ms
5,376 KB
testcase_30 AC 29 ms
5,376 KB
testcase_31 AC 107 ms
5,376 KB
testcase_32 AC 144 ms
5,376 KB
testcase_33 AC 5 ms
5,376 KB
testcase_34 AC 4 ms
5,376 KB
testcase_35 AC 4 ms
5,376 KB
testcase_36 AC 68 ms
5,376 KB
testcase_37 AC 70 ms
5,376 KB
testcase_38 AC 70 ms
5,376 KB
testcase_39 AC 65 ms
5,376 KB
testcase_40 AC 72 ms
5,376 KB
testcase_41 AC 72 ms
5,376 KB
testcase_42 AC 207 ms
5,376 KB
testcase_43 AC 214 ms
5,376 KB
testcase_44 AC 212 ms
5,376 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
/home/linuxbrew/.linuxbrew/opt/dmd/include/dlang/dmd/std/numeric.d(2999): Warning: cannot inline function `std.numeric.gcdImpl!ulong.gcdImpl`

ソースコード

diff #

import std.algorithm;
import std.array;
import std.ascii;
import std.container;
import std.conv;
import std.math;
import std.numeric;
import std.range;
import std.stdio;
import std.string;
import std.typecons;
void log(A...)(A arg) { stderr.writeln(arg); }
int size(T)(in T s) { return cast(int)s.length; }

immutable eps = 1e-18;

long lcm(long a, long b) {
    return a / gcd(a, b) * b;
}
int sign(long x) { return x == 0 ? 0 : cast(int)(x / abs(x)); }
struct Rational {
    long n, d; // numerator, denominator;
    this(long n, long d) {
        if (d < 0) {
            n *= -1;
            d *= -1;
        }
        long g = gcd(abs(n), d);
        this.n = n / g;
        this.d = d / g;
    }
    this(long n) {
        this(n, 1);
    }
    Rational opBinary(string op)(in Rational x) const if (op == "+" || op == "-") {
        long nd = lcm(d, x.d);
        long nn = mixin("n * (nd / d)" ~ op ~ "x.n * (nd / x.d)");
        return Rational(nn, nd);
    }
    Rational opBinary(string op)(real k) const if (op == "*" || op == "/") {
        return Rational(mixin("n" ~ op ~ "k"), d);
    }
    int opCmp(in Rational x) const {
        return (this - x).n.sign;
    }
}

struct P { long a, b; }

void main() {
    auto N = readln.chomp.to!int;
    auto S = new P[][3];
    foreach (i; 0 .. N) {
        int p; long a, b; readf("%s %s %s\n",&p, &a, &b);
        S[p] ~= P(a, b);
    }
    foreach (p; 0 .. 3) S[p] ~= P(1, 0);
    real[] Z;
    foreach (s; S[0]) {
        Z ~= cast(real)(s.a) / (s.a + s.b);
    }
    sort(Z);
    long ans = 0;
    foreach (x; S[1]) {
        foreach (y; S[2]) {
            auto s = cast(real)(x.a) / (x.a + x.b);
            auto t = cast(real)(y.a) / (y.a + y.b);
            if (! (s + t >= 1) ) continue;
            auto lb = 1 - min(s, t);
            auto mid = 2 - (s + t);
            auto sZ = Z.assumeSorted;
            ans += sZ.lowerBound(mid - eps).length - sZ.lowerBound(lb - eps).length;
            ans += sZ.upperBound(mid + eps).length;
        }
    }
    writeln(ans);
}
0